慕無忌1623718
2021-12-01 16:40:07
自昨天(2018 年 10 月 21 日)以來,我一直面臨著 Java 時區的一些問題??雌饋?java 正在考慮在巴西實行夏令時,但事實并非如此。我創建了以下測試以確保public static void main(String[] args) { ZonedDateTime dateTime = LocalDateTime.now().atZone(ZoneId.systemDefault()); System.out.println(dateTime); ZonedDateTime saoPaulo = dateTime.withZoneSameInstant(ZoneId.of("America/Sao_Paulo")); ZonedDateTime cuiba = dateTime.withZoneSameInstant(ZoneId.of("America/Cuiaba")); ZonedDateTime rightTime = dateTime.withZoneSameInstant(ZoneId.of("GMT-4")); System.out.println(saoPaulo); System.out.println(cuiba); System.out.println(rightTime);}這給出了以下輸出 2018-10-22T09:55:34.473-02:00[America/Sao_Paulo] 2018-10-22T09:55:34.473-02:00[America/Sao_Paulo] 2018-10-22T08:55:34.473-03:00[America/Cuiaba] 2018-10-22T07:55:34.473-04:00[GMT-04:00]這是錯誤的,因為圣保羅的當前時區應該是 -03 而 America/Cuiaba 應該是 -04任何人都知道Java上時區信息的來源是什么?我可以做些什么來解決這個問題?我知道我可以通過設置固定的 GMT 偏移量來修復它,但我不喜歡它。
2 回答

波斯汪
TA貢獻1811條經驗 獲得超4個贊
Jon Skeet 發布的鏈接幫助我解決了我的問題。Oracle 已更新有關最新版本的夏令時信息。更新JDK版本后,它按預期工作。
2018-10-22T09:19:31.761-03:00[America/Sao_Paulo]
2018-10-22T09:19:31.761-03:00[America/Sao_Paulo]
2018-10-22T08:19:31.761-04:00[America/Cuiaba]
2018-10-22T08:19:31.761-04:00[GMT-04:00]

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
錯誤修復不可用...小的解決方法。
DateTimeFormatter DT_FORMAT = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss XXX");
int 小時 = (int) ((TimeZone.getDefault().getRawOffset() / (1000*60*60)) % 24);
String strGMT = "GMT" + ( hours<0 ? hours : "+"+hours );
DT_FORMAT.format(ZonedDateTime.ofInstant(value, ZoneId.of(ZoneIdUtils.getZoneId())))
添加回答
舉報
0/150
提交
取消