如何用java从C#编写DateTime.UtcNow.Ticks

如何用java从C#编写DateTime.UtcNow.Ticks,java,c#,java-time,instant,Java,C#,Java Time,Instant,我正试图将下面两行代码从C#改写成Java long ticks1970Onwards = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks; long newTs = (DateTime.UtcNow.Ticks - ticks1970Onwards)/10000; 我尝试了多种方法,但没有得到正确的解决方案 ZonedDateTime dt1 = LocalDateTime.now().atZo

我正试图将下面两行代码从C#改写成Java

long ticks1970Onwards = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
 long newTs =    (DateTime.UtcNow.Ticks - ticks1970Onwards)/10000;
我尝试了多种方法,但没有得到正确的解决方案

        ZonedDateTime dt1 = LocalDateTime.now().atZone(ZoneId.of("UTC"));
        ZonedDateTime dt2 = LocalDateTime.of(1901, 1, 1, 0, 0).atZone(ZoneId.of("UTC"));
        Duration duration2 = Duration.between(dt2, dt1);
        System.out.printf("Duration = %s milliseconds.%n", duration2.getSeconds()*1000);
  • 范例
  • 导入java.util.*

    公开课考试{

    private static final long TICKS_AT_EPOCH = 621355968000000000L; 
    private static final long TICKS_PER_MILLISECOND = 10000; 
    
    public static void main(String[] args) { 
     long ticks = 634200192000000000L; 
    
     Date date = new Date((ticks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 
     System.out.println(date); 
    
     TimeZone utc = TimeZone.getTimeZone("UTC"); 
     Calendar calendar = Calendar.getInstance(utc); 
     calendar.setTime(date); 
     System.out.println(calendar); 
    } 
    
    }

  • 范例

    导入java.util.Calendar; 导入java.util.Date

    公共类DateHelper{

     private static final long TICKS_AT_EPOCH = 621355968000000000L; 
     private static final long TICKS_PER_MILLISECOND = 10000; 
    
     public static long getUTCTicks(Date date){ 
    
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTime(date); 
    
      return (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND) + TICKS_AT_EPOCH; 
    
     } 
    
     public static Date getDate(long UTCTicks){ 
    
      return new Date((UTCTicks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND); 
    
     } 
    
  • 使用它转换为从
    1970-01-01T00:00:00Z
    的历元开始的毫秒数,其中
    Z
    表示
    Zulu
    时间,表示
    UTC

    import java.time.Instant;
    
    public class Main {
        public static void main(String[] args) {
            Instant now = Instant.now();
            System.out.println(now.toEpochMilli());
        }
    }
    
    您可以将此结果与位于的C#代码的结果进行比较

    注意:避免使用三个字母的缩写来指定时区。时区应使用以下格式的名称来指定:地区/城市,例如(“欧洲/伦敦”)的
    ZoneId.
    。根据此约定,UTC的
    ZoneId
    可以使用
    ZoneId.of(“Etc/UTC”)来指定
    。根据
    UTC[+/-]偏移量指定的时区可以指定为
    Etc/GMT[+/-]偏移量
    ,例如
    ZoneId.of(“Etc/GMT+1”)
    ZoneId.of(“Etc/GMT+1”)
    Etc

    还有一些例外情况,例如,要指定
    土耳其
    的时区,您可以指定

    ZoneId.of("Turkey")
    
    但是,建议()使用与上述相同的模式,即表示土耳其时区的建议方式为:

    ZoneId.of("Asia/Istanbul")
    


    很可能,
    Istanbul
    被两个地区/大陆引用是它仍然由
    ZoneId.getAvailableZoneIds()返回的原因

    以下代码将为您提供所有可用的
    ZoneId
    s:

    // Get the set of all time zone IDs.
    Set<String> allZones = ZoneId.getAvailableZoneIds();
    
    //获取所有时区ID的集合。
    设置allZones=ZoneId.getAvailableZoneIds();
    
    您可以用
    System.currentTimeMillis()替换整个c
    -这将给出自1970-1年以来的毫秒数-1@IłyaBursov是的,如果你有反对面向对象的东西,你可以。使用
    Instant
    或java.time中的其他类的代码更容易解释。
    java.util
    的日期时间API及其格式化API,
    SimpleDateFormat
    已经过时且容易出错。建议您完全停止使用它们,并切换到。感谢您的参与。但这是过时的答案。我建议您不要使用
    日期
    时区
    日历
    。这些类设计糟糕且过时很长。请改用.J中的类ust如问题所述。不推荐使用时区ID
    Turkey
    。推荐土耳其使用的时区ID为
    Asia/Istanbul
    Europe/Istanbul
    (因为伊斯坦布尔是土耳其最大的城市,与欧洲的老城区和亚洲的大城区一起分布)。谢谢,@OleV.V.提供了有关
    土耳其
    的重要信息。可能是
    伊斯坦布尔
    与两个地区/大陆相关,这就是为什么它仍然由
    ZoneId.getAvailableZoneIds()返回的原因。
    ZoneId.getAvailableZoneIds()
    通常会返回大量不推荐的ID,但没有任何标记表明它们已不推荐。仅提及少数:非洲/阿斯梅拉、美国/布宜诺斯艾利斯、美国/戈达布、美国/诺克斯丁、亚洲/加尔各答、澳大利亚/LHI、巴西/阿克雷、加拿大/大西洋、CET、CST6CDT、古巴等/格林威治、GB、大都会、新西兰聊天室。我正在使用(本身不是最新的)用于检查哪些已弃用。
    ZoneId.of("Europe/Istanbul")
    
    // Get the set of all time zone IDs.
    Set<String> allZones = ZoneId.getAvailableZoneIds();