ZonedDateTime インスタンスがあり、次のようにゾーンを文字列 (EST/EDT など) として取得しようとしています。
merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())
私のセットアップでは、実際には EDT を期待していましたが、EST が返されました。夏時間を正しく反映するゾーン文字列を取得する方法を教えてください。
ZonedDateTime インスタンスがあり、次のようにゾーンを文字列 (EST/EDT など) として取得しようとしています。
merchantLocalReceiptDateTime.getZone().getDisplayName(TextStyle.SHORT, Locale.getDefault())
私のセットアップでは、実際には EDT を期待していましたが、EST が返されました。夏時間を正しく反映するゾーン文字列を取得する方法を教えてください。
わかりました、私はこの解決策が好きではありませんが、これまでに思いついた唯一のものであり、機能する唯一のものです:
したがって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+-」が表示される可能性があります。
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));