猿问

Java夏令时好像不对

自昨天(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 偏移量来修复它,但我不喜欢它。


慕无忌1623718
浏览 174回答 2
2回答

波斯汪

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

错误修复不可用...小的解决方法。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())))
随时随地看视频慕课网APP

相关分类

Java
我要回答