2016-06-10 269 views
0

我目前正在编写一个应用程序,我需要检查是否有任何文件在昨天之前创建并清理它们。此刻,当我尝试以下:Java8和夏令时

LocalDateTime today = LocalDate.now().atStartOfDay(); 
long todayEpoch = today.atZone(ZoneId.of("Europe/London")).toEpochSecond() * 1000; 

和转换毫秒回日期(在任何网上毫秒至今转换器),它告诉我,我1小时后面。

这是因为夏令时,这意味着我们是格林威治标准时间+ 1:00,这可能解释了1小时的差异。

为了解决这个问题,我不得不做改变区域ID为UTC如下:

final LocalDateTime today = LocalDate.now().atStartOfDay(); 
long todayEpoch = today.atZone(ZoneId.of("UTC")).toEpochSecond() * 1000; 

但我仍然感到困惑它是如何工作的。

有人可以解释为什么吗?

+1

你是如何得到文件创建日期的?如果这些文件是磁盘上的文件,为什么不使用'FileTime'对象,通过'Files.readAttributes(path,BasicFileAttributes.class).creationTime()'检索。从这里你得到一个'Instant',你可以用'Instant.now()。minusDays(1)'比较,没有涉及时区。 – Tunaki

回答

1
LocalDateTime today = LocalDate.now().atStartOfDay(); 

返回今天(在您的时区)在00:00。所以如果今天是2016年6月10日,这将返回2016-06-10 00:00

today.atZone(ZoneId.of("Europe/London")) 

增加了时区信息的日期,成为:2016-06-10 00:00 Europe/London,这是同一时刻为2016-06-09 23:00 UTC,由于英国夏令时间。

然后,您可以检索到纪元秒数,它是1970年1月1日UTC时间和该时刻之间所经过的秒数。

在第二个例子中,您计算​​了纪元和2016-06-10 01:00 Europe/London2016-06-10 00:00 UTC之间的毫秒数。

你需要决定你想要的。

+0

感谢@assylias的详细解释。它现在开始有意义。 –