1

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

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

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

4

3 回答 3

0

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

所以我们已经预初始化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+-”。

于 2019-07-24T19:53:28.670 回答
0
//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));
于 2020-10-05T12:45:40.743 回答
0
     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));
于 2019-07-18T13:33:17.677 回答