【问题标题】:Convert time difference in milliseconds to formatted time以毫秒为单位的时间差转换为格式化时间
【发布时间】:2013-05-13 12:46:53
【问题描述】:

假设我有两个小时之间的差异

java.text.DateFormat f = new java.text.SimpleDateFormat("HH:mm");
java.util.Date checkIn = f.parse("00:00");
java.util.Date checkOut = f.parse("05:00");

Long timeDifference = new Long(checkOut.getTime() - checkIn.getTime());

我可以通过将“timeDifference”除以 3600000(以毫秒为单位的一小时)来查看此间隔有多少小时,我得到正确的结果,5。

但是当我尝试像这样转换“timeDifference”时:

Calendar cal = new GregorianCalendar();
cal.setTime(new Date(timeDifference));
DateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.format(cal.getTime());

我得到“02:00”...为什么?如何格式化“timeDifference”?

编辑: 我真的不在乎日期。我只想要小时格式的 checkIn 和 checkOut 之间的区别,例如 HH:mm。

【问题讨论】:

    标签: java date calendar simpledateformat


    【解决方案1】:

    试试这个:

    DateFormat format = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss");
    Date zeroDt = new Date(0);
    System.out.println(format.format(zero));
    

    你得到:

    1970-01-01.02:00:00
    

    这个日期(1970 年 1 月 1 日 02:00)是轴的开始。

    现在试试:

    java.text.DateFormat f = new java.text.SimpleDateFormat("HH:mm");
    Date checkIn = f.parse("00:00");
    Date checkOut = f.parse("05:00");
    System.out.println(checkIn.getTime());
    System.out.println(checkOut.getTime());
    

    你得到:

    -7200000
    10800000
    

    如您所见,checkIn 为负数(-2 小时)。 这就是为什么 checkOut.getTime() - checkIn.getTime() 给出 5 小时 - (-2 小时) = 7 小时。

    您必须记住,对于 1970-01-01.02:00:00 之前的日期,date.getTime() 为负数。

    【讨论】:

      【解决方案2】:

      我得到“02:00”...为什么?如何格式化“timeDifference”?

      您在某种程度上误用了这些类。我的猜测是您所在的莫斯科时区是 1970 年的 GMT+3。

      简单的答案是使用 JoaTime 来处理这样的日期,或者只编写自己的解析器和格式化程序,它们的代码量大致相同。

      【讨论】:

        【解决方案3】:

        cal.setTime(new Date(timeDifference)): 你在这里所做的是将时间设置为 1970 年 1 月 1 日格林威治标准时间之后的 timeDifference (18000000) 毫秒。 (如果您要更改 SimpleDateFormat 以显示日期和时间,这将是显而易见的)。你得到 02:00 因为那是 1970 年 1 月 1 日午夜(格林威治标准时间)后 18000000 毫秒时区的时间。当我运行你的代码(在加利福尼亚)时,它给了我 21:00,因为我们是比你晚 4 小时。

        您似乎误解了 Calendar 类的工作原理 - 请参阅文档 here。除此之外,您的问题并不清楚您到底要完成什么。希望通过更好地了解日历,您将能够自己解决这个问题 - 如果没有,请编辑您的问题并准确告诉我们您需要什么日期。

        【讨论】:

          【解决方案4】:

          这里的基本问题是时差不是日期/时间戳。它不代表“时间点”。 DateFormat 接口...以及实现它的类用于格式化代表时间点的事物。

          我得到“02:00”...为什么?

          当您使用 DataFormat 解析和反解析时间值时,您得到的是“今天”的日期值。发生的情况如下:

          1. "00:00" -> 被解析为本地时区的今天午夜 == 自纪元以来的 t1 毫秒。

          2. "05:00" -> 被解析为当地时间今天凌晨 5 点 = 自纪元以来的 t2 毫秒。

          3. t2 - t1 -> 5 小时(以毫秒为单位)

          4. 日期(t2 - t1) -> 纪元后 5 小时

          5. (纪元后 5 小时)作为本地时区的值是“1970-01-01T02:00:00”

          6. 现在扔掉除了小时和分钟之外的所有东西。

          如何格式化“timeDifference”?

          简单的方法是使用long 算术将时间差转换为整数小时和分钟,然后使用String.format(...) 或使用固定宽度字段和零填充的等效格式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-07
            • 2015-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-07
            • 1970-01-01
            相关资源
            最近更新 更多