日時文字列の「z」は異なるロケールで異なる出力を持っていますか?

deHaar:

少し前、私はからタイムゾーンを抽出する方法についての質問への答えを提供する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

オレVV:

(それが唯一の問題ではありませんので、また、ロケールを提供する場合)私も経験豊富なあいまいなタイムゾーンの省略形が異なるJVMで異なる解析されています。私は、正確な動作が実証されているとは思いません。それが一致したとき、それは常にかかわらず、になる場合のJVMのデフォルトのタイムゾーンを選択したいくつかのケースでは、私は知りません。

あなたはオーバーロードされてあいまいな場合には、タイムゾーンの選択を制御することができますDateTimeFormatterBuilder.appendZoneText(TextStyle, Set<ZoneId>)方法。

ロケールが違いを作る例:ヨーロッパ/ベルリンや他の多くのヨーロッパのタイムゾーンはにフォーマットされるCentral European Timeか、CET多くのロケールで。ドイツ語ロケールでは、彼らは代わりになりますMitteleuropäische ZeitMET

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229837&siteId=1