我像這樣使用 LocalDateTime 打印大紀元時間System.out.println("timestamp "+LocalDateTime.now().atZone(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli());因此,每當我在 Intellij 中本地運行這段代碼時,我都會得到正確的時間戳,加爾各答時區約為1559461130527. 這是大約Sunday, June 2, 2019 1:23:50.527 PM加爾各答時間然后我有一個帶有 docker 容器的服務器,每當我運行這段相同的代碼時,我都會得到一個完全不同的時間戳,大約是1559439902340. 這是周圍Sunday, June 2, 2019 7:30:02.340 AM。我錯過了什么,服務器不應該根據指定的時區打印時間戳。任何幫助,將不勝感激。謝謝。
2 回答

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
您應該在 now() 語句中使用區域偏移量。
例如要獲取我使用的 UTC 時間LocalDateTime.now(ZoneOffset.UTC);
在您的情況下,您可以直接使用時區的 ZoneId
LocalDateTime.now(ZoneId.of("Asia/Kolkata"));

慕森王
TA貢獻1777條經驗 獲得超3個贊
如果你看一下LocalDateTime::now
方法的實現,它看起來像:
public static LocalDateTime now() { return now(Clock.systemDefaultZone()); }
因此它將使用Clock
您系統的實現默認值??赡苣谌萜髦惺褂貌煌牟僮飨到y,這就是為什么會使用不同的默認時鐘。
因此LocalDateTime::now
,在您的情況下,方法調用將根據系統默認值返回不同的值Clock
。然后,如果您想將其轉換為ZonedDateTime
usingatZone
方法 - 您將在同一區域有不同的時間 - 因為LocalDateTime::now
在不同的操作系統中為不同的默認時鐘返回不同的值。
為了克服這個問題,您可以ZonedDateTime
直接使用類并將區域傳遞給now
方法:
ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();
添加回答
舉報
0/150
提交
取消