2016-06-10 270 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的詳細解釋。它現在開始有意義。 –