【问题标题】:Converting string to milliseconds将字符串转换为毫秒
【发布时间】:2013-03-16 17:12:31
【问题描述】:

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

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

【问题讨论】:

  • 它对我来说很好用,打印 13012217530001301219953000。您在哪个时区/地区运行?
  • 随着我的代码运行,第一个值大于第二个。
  • 您的代码没有问题,打印的内容正确:ideone.com/EIS1wI
  • 我的猜测是您系统的默认语言环境发生了时区更改,类似于this question
  • @Vulcan:是的,2011 年 3 月 27 日时区更改在许多国家很常见,请参阅 this link

标签: java datetime milliseconds


【解决方案1】:

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

1301191153000 - 1301189353000 = 1800000ms = 30 min

由于 DST 于 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)

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

【讨论】:

  • 谢谢,就是这个原因!
【解决方案2】:

我敢打赌,2011 年 3 月 27 日夏令时时间从凌晨 2 点 (am) 更改为 3 点 (am)(请参阅 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 分钟)。

【讨论】:

    【解决方案3】:

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

            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,您可能永远不知道是否应用了时间更改,因此间隔可能是一小时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2012-08-11
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多