为了账号安全,请及时绑定邮箱和手机立即绑定

Java夏令时好像不对

Java夏令时好像不对

慕无忌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]


查看完整回答
反对 回复 2021-12-01
?
慕妹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())))


查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 173 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信