30秒似乎是1小时30秒?

时间:2017-06-29 09:33:04

标签: java time apache-flink

我想验证我的时间戳。我附上了代码片段:

import org.apache.flink.streaming.api.windowing.time.Time;   

Date date = new Date(Time.seconds(30).toMilliseconds());
DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
String dateFormatted = formatter.format(date);
logger.debug(Time.seconds(30).toMilliseconds() + " " + dateFormatted);

原来,结果是:

30000 01:00:30:000

编辑:

   [user@hdp ~]$ date
   Thu Jun 29 11:39:27 CEST 2017

我错过了什么? THX!

2 个答案:

答案 0 :(得分:7)

我不知道你的代码中有Time,但我认为Time.seconds(30).toMilliseconds()将返回30,000(30秒内的毫秒数)。

您正在以不适合的方式使用课程java.util.Date。类Date实际上是一个时间戳,它包含自固定参考点(01-01-1970,00:00:00 GMT)以来的毫秒数。

在以下代码行中,您使用类Date来存储一个时间(小时,分钟,秒和毫秒):

Date date = new Date(Time.seconds(30).toMilliseconds());

Date不是为此而设计的,并不适合存储一段时间。上面的行中发生的是你得到一个Date对象,它指的是格林尼治标准时间01-01-1970 00:00:30(格林威治标准时间1970年1月1日午夜后30秒)。< / p>

然后使用SimpleDateFormat将其格式化为字符串。您自己的时区很可能比格林尼治标准时间提前1小时,SimpleDateFormat将使用您当地的时区来格式化日期。

如果您需要存储一天中的某个时间(小时,分钟,秒和毫秒),请使用课程java.time.LocalTime而不是课程java.util.Date。如果您需要存储持续时间,请使用课程java.time.Duration

Duration d = Duration.ofSeconds(30);

您应该使用新的java.time API而不是旧的java.util.Date类,因为它要好得多。如果您使用的是较旧的Java版本(早于Java 8),则Joda Time是一个不错的选择。

答案 1 :(得分:1)

您创建的January 1, 1970, 00:00:30 GMT的值为sub(a) = sub(b) + sub(c) sub(b) = sub(c) * 2 + 5 sub(c) = sub(a) - 1 。 正如其他人所指出的,您的时区与GMT相差一小时......