为什么我在给定的字符串时间内得到错误的毫秒数?

时间:2017-03-16 16:41:45

标签: java simpledateformat

DateFormat df1 = new SimpleDateFormat("kk:mm");
Date d = null;

try {
    d = df1.parse("21:00");
} catch (ParseException e) {
    e.printStackTrace();
}

我得到61200000毫秒但是当我在线转换它时,我得到了不同的值。

2 个答案:

答案 0 :(得分:1)

SimpleDateFormat并不像名称所暗示的那么简单。特别是它对时区的处理有时模糊不清。在这种情况下,我敢说它使用你的JVM的时区设置(可能从你的计算机的设置中取代),显然是一个与UTC相差4小时的设置。因此,当您的时区中的时间是21:00(晚上9点)时,它是UTC的17:00。 Date对象中的毫秒值始终为UTC,因此您得到17 * 60 * 60 * 1000 = 61 200 000.如果您在不同时区的服务器上在线尝试,您可能会得到不同的结果。

java.time.Duration

我认为你真正想要的是Duration.parse("PT21H0M")。这将给你21小时0分钟的持续时间。您可以使用其toMillis方法获得21 * 60 * 60 * 1000 = 75 600 000.

Java 8的日期和时间类(其中Duration只是一个)通常比旧类更愉快。

或者你可以pass a number of hours

Duration d = Duration.ofHours( 21 );

ISO 8601持续时间

语法PT21H0M起初可能看起来有点奇怪,但它是一个国际标准,ISO 8601,所以我们可能更好地学会使用它,而且它很容易学习。

答案 1 :(得分:-1)

如果你这样做:

d = df1.parse("21:00");

你得到这个日期

Thu Jan 01 21:00:00 CET 1970

和纪元是72000000,要转换那个,你需要除以1000

可验证的here