我有 ZonedDateTime 实例,试图将区域作为字符串(例如 EST/EDT),如下所示:
merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())
对于我的设置,它返回我 EST,而事实上我期待 EDT。请告知如何获取正确反映夏令时的区域字符串。
我有 ZonedDateTime 实例,试图将区域作为字符串(例如 EST/EDT),如下所示:
merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())
对于我的设置,它返回我 EST,而事实上我期待 EDT。请告知如何获取正确反映夏令时的区域字符串。
好的,我不喜欢这个解决方案,但它是迄今为止我想出的唯一一个,唯一一个有效的:
所以我们已经预初始化ZonedDateTime merchantLocalReceiptDateTime
(记住,这是threetenbp)。我们可以这样做(是给定时间的夏令时吗?):
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+-”。
//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));
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));