2

「yyyy-MM-dd hh:mm:ss z」という形式の Date を含むデータの入力ストリームがあります。TimeZone は、Date をさらに伝播する際に保持する必要があります。以下はテスト プログラム (エラー スタックを含む) です - 私のソリューションの何が問題なのですか?

public class Test {

public static void main(String[] args) {
    try {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss z");
        ZonedDateTime zdt = ZonedDateTime.parse("2016-12-09 09:30:21 UTC", dtf);
        System.out.println(zdt);
    } catch (Exception e) {
        System.err.println("Exception in 1st approach: " + e.getMessage());
    }

    try {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd hh:mm:ss z").toFormatter();
        ZonedDateTime zdt = ZonedDateTime.parse("2016-12-09 09:30:21 UTC", dtf);
        System.out.println(zdt);
    } catch (Exception e) {
        System.err.println("Exception in 2nd approach: " + e.getMessage());
    }
  }
}

出力 (例外メッセージ):

最初のアプローチの例外: テキスト '2016-12-09 09:30:21 UTC' を解析できませんでした: TemporalAccessor から ZonedDateTime を取得できません: {HourOfAmPm=9, MinuteOfHour=30, MicroOfSecond=0, SecondOfMinute=21, NanoOfSecond= 0, MilliOfSecond=0},ISO,UTC は java.time.format.Parsed タイプの 2016-12-09 に解決されました

2 番目のアプローチの例外: テキスト '2016-12-09 09:30:21 UTC' を解析できませんでした: TemporalAccessor から ZonedDateTime を取得できません: {HourOfAmPm=9, MinuteOfHour=30, MicroOfSecond=0, SecondOfMinute=21, NanoOfSecond= 0, MilliOfSecond=0},ISO,UTC は java.time.format.Parsed タイプの 2016-12-09 に解決されました

JDK バージョン 1.8.0_111

zoneddatetime タグで同様の質問を読みましたが、問題の解決策が見つかりませんでした。

4

1 に答える 1

2

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z"); 使用する代わりに使用する必要があります

  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss z");

したがってh、あなたのパターンではH. ドキュメンテーション によると、h定義するときに使用されます。さらに、パターンに同じものclock-hour-of-am-pm を含めるか、単に使用する必要がありますaam-pm-of-dayH

于 2016-12-09T08:36:20.960 に答える