30秒似乎是1小时30秒?

m1m5dgzv  于 2021-06-25  发布在  Flink
关注(0)|答案(2)|浏览(578)

我想确认一下我的时间戳。我附上了代码片段:

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

我错过了什么?谢谢!

8dtrkrch

8dtrkrch1#

这个 Date 你创造的价值 January 1, 1970, 00:00:30 GMT . 正如其他人指出的,你的时区与格林威治标准时间相差一小时。。。

kwvwclae

kwvwclae2#

我不知道是什么 Time 在你的代码里,但我想 Time.seconds(30).toMilliseconds() 将返回30000(30秒内的毫秒数)。
你在用课堂 java.util.Date 在某种程度上,它不是专为。班级 Date 实际上是一个时间戳,它包含自固定参考点(01-01-1970,00:00:00 gmt)起的毫秒数。
在下面的代码行中,您使用的是类 Date 要仅存储一个时间(小时、分钟、秒和毫秒数):

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

班级 Date 不是为这个而设计的,也不适合一次性储存。在上面的一行中发生的是 Date 指1970年1月1日00:00:30 gmt(gmt时区1970年1月1日午夜后30秒)时刻的对象。
然后使用 SimpleDateFormat . 你自己的时区很可能比格林尼治时间早1小时,而且 SimpleDateFormat 将使用您的本地时区设置日期格式。
如果您需要存储一天中的某个时间(小时、分钟、秒和毫秒),那么使用类 java.time.LocalTime 而不是上课 java.util.Date . 如果需要存储持续时间,请使用类 java.time.Duration :

Duration d = Duration.ofSeconds(30);

你应该用新的 java.time 反正api不是旧的 java.util.Date 上课,因为好多了。如果您使用的是较旧的java版本(早于java8),那么joda time是一个很好的选择。

相关问题