假设我有两个小时的差异
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。
答案 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解析和解析时间值时得到的是“今天”的日期值。会发生什么如下:
“00:00” - >今天被解析为当地时区= = t1毫秒以来的午夜。
“05:00” - >今天解析为当地时区早上5点=自纪元以来的t2毫秒。
t2 - t1 - > 5小时(以毫秒为单位)
日期(t2-t1) - >纪元后5小时
(纪元后5小时),当地时区的值为“1970-01-01T02:00:00”
现在除了小时和分钟之外扔掉所有东西。
如何格式化“timeDifference”?
简单的方法是使用long
算术将时差转换为整数小时和分钟,然后使用String.format(...)
或使用固定宽度字段和零填充的等效值进行格式化。