1

ZonedDateTime インスタンスがあり、次のようにゾーンを文字列 (EST/EDT など) として取得しようとしています。

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

私のセットアップでは、実際には EDT を期待していましたが、EST が返されました。夏時間を正しく反映するゾーン文字列を取得する方法を教えてください。

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
     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 に答える