繁体   English   中英

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

[英]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”的日期值。 发生的情况如下:

  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(...)或使用固定宽度字段和零填充进行等效设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM