将时间差(以毫秒为单位)转换为格式化时间

时间:2013-05-13 12:46:53

标签: java date calendar simpledateformat

假设我有两个小时的差异

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。

4 个答案:

答案 0 :(得分: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()为负。

答案 1 :(得分:0)

  

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

你有点误用这些课程。我的猜测是你在1970年的格林尼治标准时间+3的莫斯科时区。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这里的基本问题是时差不是日期/时间戳。它不代表“时间点”。 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. 现在除了小时和分钟之外扔掉所有东西。

  7.   

    如何格式化“timeDifference”?

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