[英]Convert time difference in milliseconds to formatted time
假设我有两个小时的差额
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”?
编辑:我真的不在乎日期。 我只想要以HH:mm之类的小时格式签入和签出之间的区别。
尝试这个:
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小时的原因。
您必须记住,date.getTime()对于1970-01-01.02:00:00之前的日期为负。
我收到“ 02:00” ...为什么? 如何格式化“ timeDifference”?
您在某种程度上滥用了这些类。 我的猜测是您所在的莫斯科时区是1970年GMT + 3。
简单的答案是使用JoaTime处理类似的日期,或者只编写自己的解析器和格式化程序,它们的代码量几乎相同。
cal.setTime(new Date(timeDifference)):
您在这里所做的是将格林威治标准时间1970年1月1日之后的时间设置为timeDifference
(18000000)毫秒。 (如果要更改SimpleDateFormat以显示日期和时间,这将是显而易见的)。 您将获得02:00,因为这是您所在时区的时间,即1970年1月1日午夜(GMT)后的18000000毫秒。当我运行您的代码(在加利福尼亚州)时,它给了我21:00,因为落后您4小时。
似乎您误解了Calendar类的工作原理-请参阅此处的文档。 除此之外,您的问题还不清楚您要完成的目标。 希望对日历有更好的了解,您将可以自己解决这个问题-否则,请编辑问题并确切告诉我们您需要什么日期。
这里的基本问题是时间差不是日期/时间戳。 它不代表“时间点”。 DateFormat
接口...和实现它的类用于格式化表示某个时间点的东西。
我收到“ 02:00” ...为什么?
使用DataFormat解析和解析时间值时得到的结果是“ today”的日期值。 发生的情况如下:
“ 00:00”->解析为当前时间所在的当地时区== t1毫秒。
“ 05:00”->解析为今天凌晨5点(该时间段以来的当地时区= t2毫秒)。
t2-t1-> 5小时(以毫秒为单位)
日期(t2-t1)->历时后5小时
(在纪元后5小时)作为本地时区的值是“ 1970-01-01T02:00:00”
现在,把小时和分钟之外的所有东西都扔掉。
如何格式化“ timeDifference”?
一种简单的方法是使用long
算法将时差转换为整数小时和分钟,然后使用String.format(...)
或使用固定宽度字段和零填充进行等效设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.