Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 30秒似乎是1小时30秒?_Java_Time_Apache Flink - Fatal编程技术网

Java 30秒似乎是1小时30秒?

Java 30秒似乎是1小时30秒?,java,time,apache-flink,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); lo

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

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

我错过了什么?谢谢

您创建的
日期的值为
1970年1月1日00:00:30 GMT

正如其他人所指出的,您的时区与格林尼治标准时间相差一小时。

我不知道您的代码中的时间是多少,但我假设
Time.seconds(30).tomillesons()
将返回30000(30秒内的毫秒数)

您使用的类
java.util.Date
的方式不是专门为它设计的。类
Date
实际上是一个时间戳,它包含自固定参考点(01-01-1970,00:00:00 GMT)起的毫秒数

在下面的代码行中,您使用class
Date
仅存储一个时间(以小时、分钟、秒和毫秒为单位):

Class
Date
不是为此而设计的,不适合仅存储时间。上面一行中出现的是一个
Date
对象,它指的是1970年1月1日00:00:30 GMT(GMT时区1970年1月1日午夜后30秒)的时刻

然后使用
simpleDataFormat
将其格式化为字符串。您自己的时区最有可能比格林尼治标准时间提前1小时,并且
SimpleDateFormat
将使用您的本地时区设置日期格式

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

Duration d = Duration.ofSeconds(30);

无论如何,您应该使用新的
java.time
API,而不是旧的
java.util.Date
类,因为它更好。如果您使用的是较旧的Java版本(比Java 8旧),那么这是一个很好的选择。

您所在的时区是什么?噢,该死,UTC+2!你确定你的意思不是说欧洲/巴黎(纯粹是使用你的用户名)?它与UTC+2不一样。如果您在UTC+2,则是
02:00:30:000
。CET/CEST不是一个定义明确的时区。例如,
Europe/Paris
Europe/Berlin
都使用CET/CEST作为它们的缩写,但它们没有完全相同的夏令时规则(我记得1970年以前)。
ZoneId.of(“Europe/Prague”)
在我的Java中工作,是的,它给出了CET/CEST(没有检查它的历史变化).我只需要打印出正确的持续时间。我使用的库是org.apache.flink.streaming.api.windowing.time.time;这两个小时不同。让我猜,由于夏季(DST),现在有两个小时了。1970年1月1日1小时。我接近了吗?(您问题中控制台输出中的CEST是中欧夏季时间,距离格林尼治标准时间2小时,正确)。
Duration d = Duration.ofSeconds(30);