如何获取符合夏令时的区域名称(例如 EDT)

How to get zone name that respects daylight saving (e.g. EDT)

提问人:ror 提问时间:7/18/2019 最后编辑:Kanagavelu Sugumarror 更新时间:10/6/2020 访问量:481

问:

我有 ZonedDateTime 实例,尝试将区域获取为字符串(例如 EST/EDT),如下所示:

merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())

对于我的设置,它返回我 EST,而实际上我期待 EDT。请建议如何获取正确反映夏令时的区域字符串。

java-time threetenbp

评论


答:

0赞 Dhara Jani 7/18/2019 #1
     static DateTimeFormatter etFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mma 'ET'");

      static ZoneId istZoneId = ZoneId.of("Asia/Kolkata");
      static ZoneId etZoneId = ZoneId.of("America/New_York");

 LocalDateTime currentDateTime = LocalDateTime.now();

    ZonedDateTime currentISTime = currentDateTime.atZone(istZoneId);                
    ZonedDateTime currentETime = currentISTime.withZoneSameInstant(etZoneId);       //ET Time

    System.out.println(etFormat.format(currentETime));

评论

0赞 ror 7/18/2019
谢谢,我正在使用 threetenbp,所以不能使用上面的内容作为答案,但即使我会,我想上面的内容也会给我带来更多的打击?
0赞 Dhara Jani 7/18/2019
也许你从中得到帮助:github.com/JakeWharton/ThreeTenABP
0赞 ror 7/18/2019
是的,我已经有基于即时和 ZoneId 信息创建的 ZoneDateTime 实例。问题不在于创建 ZoneDateTime,而在于以用户友好的方式读取其区域信息,如果适用,请尊重日光。
0赞 Dhara Jani 7/24/2019
@ror立即查看更新的答案......我希望它现在对你有用!
0赞 ror 7/24/2019
感谢您的努力!刚才运行,它给了我:07/24/2019 at 04:59AM ET 但是我试图完成的是获取时区。对于纽约的“现在”来说,它应该是 EDT,但是即使使用您的方法,我也会得到 EST - 这就是问题所在。我很困惑为什么在 android 中处理日期如此困难。
0赞 ror 7/25/2019 #2

好的,我不喜欢这个解决方案,但它是我迄今为止想出的唯一一个解决方案,也是唯一有效的解决方案:

所以我们已经预初始化了(记住,这是threetenbp)。然后我们可以这样做(给定时间是夏令时吗?ZonedDateTime merchantLocalReceiptDateTime

boolean isDaylightSaving = merchantLocalReceiptDateTime.getZone()
                .getRules().isDaylightSavings(merchantLocalReceiptDateTime.toInstant());

然后,为了获得尊重夏令时的时区的简短表示,我们可以这样做(TimeZone 不是 threeten 的一部分,它是 java.util):

TimeZone.getTimeZone(merchantLocalReceiptDateTime.getZone().getId())
                .getDisplayName(isDaylightSaving, TimeZone.SHORT)

对于纽约(假设设备语言为英语/美国),上述内容在冬季产生 EST 和现在的 EDT。对于没有特定夏令时名称的时区,它可以给出例如“GMT+2”、“GMT+3”等。如果语言不同,您可能会得到“GMT+-”。

0赞 Kanagavelu Sugumar 10/5/2020 #3
//SHORT: CEST
DateTimeFormatter.ofPattern("zzz").format(zonedDateTime)

//SHORT: CET 
ZoneId.getDisplayName(TextStyle.SHORT,Locale.ENGLISH)    

//LONG: Central European Summer Time
DateTimeFormatter.ofPattern("zzzz").format(zonedDateTime)

//LONG: Central European Time
ZoneId.getDisplayName(TextStyle.LONG,Locale.ENGLISH)

//Use this for converting CET to CEST and vice versa
TimeZone tz = TimeZone.getTimeZone(timeZone.getZone());
tz.getDisplayName(true, TimeZone.SHORT, Locale.ENGLISH));