自昨天(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
提交
取消