将字符串转换为毫秒数

12

我想要计算两个日期(格式为"yyyyMMddHHmmss")之间的时间差。基本思路是先将字符串日期转换为毫秒数,然后获取时间差。

Calendar c1 = Calendar.getInstance();
c1.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327032913"));
System.out.println(c1.getTimeInMillis());
Calendar c2 = Calendar.getInstance();
c2.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse("20110327025913"));     
System.out.println(c2.getTimeInMillis());

结果:

1301189353000

1301191153000

显然,第一个日期比第二个日期晚,但它转换成毫秒数却更小。我在格式上犯了什么错误吗?


1
它对我来说运行良好,打印出 13012217530001301219953000。你使用的时区/语言环境是什么? - FThompson
我的代码运行后,第一个值大于第二个值。 - Sachin
你的代码没有问题,它输出了正确的结果:http://ideone.com/EIS1wI - Alex
正如@Vulcan所说,“Locate”在某些情况下可能很重要,就像你的情况一样。这是一个例子:http://stackoverflow.com/questions/11510713/parsing-string-with-spaces-to-date-lead-to-parseexception/11510955#11510955 - manix
1
我的猜测是您系统的默认区域设置发生了时区更改,类似于此问题。 - FThompson
1
@Vulcan:是的,许多国家在2011年3月27日进行时区更改,请参见此链接。 - jlordo
3个回答

8

两个时间戳之间的时间差为30分钟(以毫秒为单位):

1301191153000 - 1301189353000 = 1800000ms = 30 min

由于3月27日进行了夏令时调整,将在凌晨2点向前调整为3点,因此时间戳如下:
20110327032913 => 2011-03-27 03:29:13

20110327025913 => 2011-03-27 02:59:13

实际上被解释成:
2011-03-27 03:29:13

2011-03-27 03:59:13 (+1 hour from original time)

因此,第二个时间戳比第一个时间戳晚,当转换为毫秒时,第二个时间戳的值大于第一个时间戳。

谢谢,这正是原因! - user2177467

4

我猜你所在的地区是按照夏令时于2011年3月27日将时间从凌晨2点调整到凌晨3点(请参见此链接)。

你的初始时间是

2011 03 27 03 29 13
yyyy MM dd HH mm ss

你的第二次机会是

2011 03 27 02 59 13 // does not exist because of time change
yyyy MM dd HH mm ss

所以,实际上,您的第二次是:
           ,,
2011 03 27 03 59 13
yyyy MM dd HH mm ss

显然这个时间比你第一次提交的时间晚了30分钟(而不是早了30分钟)。

2

也许这段代码可以帮助你:

        Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));            
        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));       

        c1.setTime(sdf.parse("20110327032913"));
        System.out.println(c1.getTimeInMillis());

        c2.setTime(sdf.parse("20110327025913"));     
        System.out.println(c2.getTimeInMillis());
                    System.out.println((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60)+ " minutes");

问题在于,如果你的字符串不是UTC时间,你可能永远不知道是否应用了时间更改,因此时间间隔可能会偏差一小时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接