少し前、私はからタイムゾーンを抽出する方法についての質問への答えを提供するZonedDateTime
から解析されましたString
。
これは、一般的に働いたが、OPのシステムAN何とか私はもう行かせていない私の1、上の同じコードの異なる出力がありました。
関連する質問は、取得する方法を尋ねたZoneId
からZonedDateTime
、私は道を提供します。確かに、それが受け入れられた答えではないが、それでも誰かからupvote価値が見えました。
私の答えについて特別なことが懸念される'z'
時間を解析するために使用されるパターンでString
。その中にタイムゾーン名があるString
ゾーンを表す"Australia/Adelaide"
ことで"... ACST"
(オーストラリア中部標準時)。
私は私のシステムおよび印刷/フォーマットにそれを解析する場合ZonedDateTime
使用してDateTimeFormatter.ISO_ZONED_DATE_TIME
、それは時間を出力"America/Manaus"
し、抽出されたZoneId
、それはまだ南米からのものです。OPは、出力ラインショーの彼のシステム上で、その少なくとも一つの所望/正しい、私の答え以下のコメントで述べましたZoneId
。
そんなことがあるものか?システムのデフォルトは、パースに影響していたロケールん'z'
日時にString
秒?
これは私の質問の答えでプラス私の出力からのコードですZoneId.systemDefault()
:
public static void main(String args[]) throws Exception {
String time = "2 Jun 2019 03:51:17 PM ACST";
String pattern = "d MMM yyyy hh:mm:ss a z"; // z detects the time zone (ACST here)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
// parse a time object using the formatter and the time String
ZonedDateTime zdt = ZonedDateTime.parse(time, formatter);
// print it using a standard formatter
System.out.println(zdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// extract the zone id
ZoneId zoneId = zdt.getZone();
ZoneId sysDefault = ZoneId.systemDefault();
// print the zone id
System.out.println("Time zone of parsed String is " + zoneId);
System.out.println("System default time zone is " + sysDefault);
// retrieve the instant seconds
Instant instant = zdt.toInstant();
// print the epoch seconds of another time zone
System.out.println("Epoch seconds in Australia/Adelaide are "
+ instant.atZone(ZoneId.of("Australia/Adelaide")).toEpochSecond());
}
その出力は以下です:
2019-06-02T15:51:17-04:00[America/Manaus]
Time zone of parsed String is America/Manaus
System default time zone is Europe/Berlin
Epoch seconds in Australia/Adelaide are 1559505077
私が作ったか確認し、異なるシステムのデフォルトの影響を説明してきた過ちに誰ポイント私は缶ZoneId
の解析上の秒String
にはZonedDateTime
?
(それが唯一の問題ではありませんので、また、ロケールを提供する場合)私も経験豊富なあいまいなタイムゾーンの省略形が異なるJVMで異なる解析されています。私は、正確な動作が実証されているとは思いません。それが一致したとき、それは常にかかわらず、になる場合のJVMのデフォルトのタイムゾーンを選択したいくつかのケースでは、私は知りません。
あなたはオーバーロードされてあいまいな場合には、タイムゾーンの選択を制御することができますDateTimeFormatterBuilder.appendZoneText(TextStyle, Set<ZoneId>)
方法。
ロケールが違いを作る例:ヨーロッパ/ベルリンや他の多くのヨーロッパのタイムゾーンはにフォーマットされるCentral European Time
か、CET
多くのロケールで。ドイツ語ロケールでは、彼らは代わりになりますMitteleuropäische Zeit
かMET
。