将字符串转换为毫秒

时间:2013-03-16 17:12:32

标签: java datetime milliseconds

我想计算两个日期之间的时差(格式为“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

显然,第一个日期晚于第二个日期,但其转换后的毫秒数较小。我在格式上有任何错误吗?

3 个答案:

答案 0 :(得分:8)

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

1301191153000 - 1301189353000 = 1800000ms = 30 min

由于DST在3月27日发生变化,时钟正在凌晨2点从凌晨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)

因此,第二个时间戳来得晚,当转换为ms时,它比第一个更大。

答案 1 :(得分:4)

我打赌你在2011年3月27日的夏令时从2点(上午)到3点(上午)变化的地方(见this link

你的第一次是

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 :(得分: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");

*问题是如果您的String不是UTC,您可能永远不知道是否应用了时间更改因此间隔可能是一小时。