在計算機中,每個檔案都一個時間戳,之前遇到過一個關于檔案時間戳的問題,這裡記錄下來分享給大家。
首先,遇到的問題的原型是:在一段Java程式中,通過Java的File.lastModified API去獲得一個檔案的時間戳,示例代碼如下:
ClassLoader classLoader = DataMigrationController.class.getClassLoader();
URL url = classLoader.getResource("./application.properties");
File file = new File(url.toURI());
System.out.println(file + ": " + file.lastModified() + "->" + new Date(file.lastModified()));
URL url2 = classLoader.getResource("./bootstrap.properties");
File file2 = new File(url2.toURI());
System.out.println(file2 + ": " + file2.lastModified() + "->" + new Date(file2.lastModified()));
Date date = new Date();
System.out.println("current date: " + System.currentTimeMillis() + "->" + date);
當我在本地機器(成都)運作這段程式時,得到的結果如下:
application.properties: 1558083157000->Fri May 17 16:52:37 CST 2019
bootstrap.properties: 1558083157000->Fri May 17 16:52:37 CST 2019
current date: 1558083181463->Fri May 17 16:53:01 CST 2019
但是,當我把這段程式打好包(jar)部署到伺服器上(兩分鐘之内),運作這段程式時,卻得到如下結果(我expect得到的檔案的時間戳和本地應該一緻):
application.properties: 1558111956000->Fri May 17 16:52:36 UTC 2019
bootstrap.properties: 1558111956000->Fri May 17 16:52:36 UTC 2019
current date: 1558083328412->Fri May 17 08:55:28 UTC 2019
從上面的結果可以看出,得到的兩個檔案的時間戳比伺服器上當時的時間還要晚,這很奇怪,怎麼拿到了一個未來的時間?
起初懷疑是不是機器的時鐘有問題。通過列印出來的目前時間來看,本地時間(Fri May 17 16:53:01 CST 2019)和伺服器時間(Fri May 17 08:55:28 UTC 2019)是吻合的,說明時鐘是沒有問題。
後來發現,根本原因是壓縮檔案中的子檔案的時間戳沒有時區的資訊,隻有日期+時間的資訊。具體出處可見(https://en.wikipedia.org/wiki/Zip_(file_format))中的一段話:
The ZIP format has no notion of time zone, so timestamps are only meaningful if it is known what time zone they were created in.
是以當在伺服器上運作這段程式時,jar包解壓,壓縮檔案裡面的子檔案的時間戳變成日期+時間+新的時區,即是我們看到的日期+時間沒變,隻是時區變成了伺服器的時區UTC。