30秒似乎是1小时30秒



我想验证时间戳。我附加了代码段:

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!

我不知道您的代码中的Time是什么,但是我认为Time.seconds(30).toMilliseconds()将返回30,000(30秒内毫秒(。

您正在以不适合其设计的方式使用java.util.Date类。Date类实际上是时间戳,它包含许多毫秒,因为固定参考点(01-01-1970,00:00:00:00:00:00:00:00:00:00(。

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

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

Date类并非为此而设计,也不适合仅存储一次。上面的行中发生的事情是,您获得了一个Date对象,该对象是指格林尼治标准时间01-01-1970,00:00:00:00:30(1970年1月1日午夜后30秒,在GMT TimeZone中(。

(。

然后,您使用SimpleDateFormat将其格式化为字符串。您自己的时区很可能比GMT提前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是一个很好的选择。

您创建的Date具有January 1, 1970, 00:00:30 GMT的值。正如其他人指出的那样,您的时区与GMT有所不同...

相关内容

  • 没有找到相关文章

最新更新