【问题标题】:Displaying wrong time difference显示错误的时差
【发布时间】:2016-05-11 12:14:13
【问题描述】:

我尝试了很多方法来显示两次之间的差异,但我无法找到解决方案:

long strt = System.currentTimeMillis();//1462968291733
Thread.sleep(5000);
long end = System.currentTimeMillis();//1462968296733

long diff = end - strt;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diff);
TimeZone timeZone = TimeZone.getTimeZone("IST");
calendar.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));

System.out.println(calendar.getTime());//05:30:05

打印错误的输出:

1970 年 1 月 1 日星期四 05:30:05 IST

输出应该是

1970 年 1 月 1 日星期四 00:00:05 IST

【问题讨论】:

  • 我复制/粘贴您的代码,它在我的环境中工作正常。
  • "实际输出是" 你的意思是“实际输出应该是”吗?

标签: java date time calendar


【解决方案1】:

您对时区感到困惑。请尝试以下操作:

long strt = System.currentTimeMillis();// 1462968291733
    Thread.sleep(5000);
    long end = System.currentTimeMillis();// 1462968296733

    long diff = end - strt;


    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(diff);
    TimeZone cutsomTimeZone = TimeZone.getTimeZone("IST");

     DateFormat formatter = new SimpleDateFormat
                ("EEE MMM dd HH:mm:ss zzz yyyy");
    formatter.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
    System.out.println(formatter.format(calendar.getTime()));//

    formatter.setTimeZone(cutsomTimeZone);
    System.out.println(formatter.format(calendar.getTime()));

首先,正如 javadoc 所说,System.currentMillis()UTC 中返回自 1970 年 1 月 1 日以来的毫秒数,这显然与 IST 不同。

其次,calendar.getTime() 返回的Date 对象不包含时区。您使用System.out.println(calendar.getTime()) 获得的输出使用您系统的默认TimeZone,这似乎是IST。

第三,请不要使用Date api,它真的很糟糕。如果可能,请选择java.time

【讨论】:

    【解决方案2】:

    这是因为默认打印输出使用默认语言环境,在您的情况下为 +5:30

    您需要在所需的时区格式化输出,例如通过使用SimpleDateFormat:

    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(sdf.format(calendar.getTime()));
    

    【讨论】:

      【解决方案3】:

      answer by dejvuthanswer by orris 都是正确的。

      避免使用旧的日期时间类。它们在 Java 8 和后来的 java.time 框架中被取代。对于 Java 6 和 7,大部分功能已由 ThreeTen-Backport 项目向后移植,并由 ThreeTenABP 项目进一步适应 Android。

      根本不需要时区来记录经过的时间。

      Instant 代表 UTC 时间轴上的一个时刻,分辨率高达 nanoseconds。在 Java 8 中,当前时刻的捕获分辨率仅为 milliseconds,但在 Java 9 中 Clock 的新实现将捕获最多纳秒,具体取决于您计算机的时钟硬件能力。

      Instant start = Instant.now();
      …
      Instant stop = Instant.now();
      

      Duration 将时间跨度捕获为整秒的总数,将小数秒捕获为纳秒。此值未附加到时间线。

      Duration duration = Duration.between( start , stop );
      

      java.time 类在生成日期时间值的文本表示时使用ISO 8601 标准。在两秒半的持续时间内,您将获得类似PT2.5S 的值,其中P 标记开始(用于句点),T 将任何年-月-日与小时-分钟-秒分开.这种格式可以防止时钟格式的歧义,其中00:00:02.5 看起来像是午夜过后两分钟的时间。但是,如果您愿意,可以向Duration 询问数字。

      String output = duration.toString();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        相关资源
        最近更新 更多