提问人:ror 提问时间:7/18/2019 最后编辑:Kanagavelu Sugumarror 更新时间:10/6/2020 访问量:481
如何获取符合夏令时的区域名称(例如 EDT)
How to get zone name that respects daylight saving (e.g. EDT)
问:
我有 ZonedDateTime 实例,尝试将区域获取为字符串(例如 EST/EDT),如下所示:
merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())
对于我的设置,它返回我 EST,而实际上我期待 EDT。请建议如何获取正确反映夏令时的区域字符串。
答:
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));
评论