ホームページ  >  記事  >  Java  >  Java SimpleDateFormat が西暦の日付を 1 月 (yyyy/MM/DD と yyyy/MM/dd) に変換するのはなぜですか?

Java SimpleDateFormat が西暦の日付を 1 月 (yyyy/MM/DD と yyyy/MM/dd) に変換するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 07:50:29949ブラウズ

Why Does Java SimpleDateFormat Convert AD Dates to January (yyyy/MM/DD vs yyyy/MM/dd)?

Java SimpleDateFormat の難題: すべての月がデフォルトで 1 月になる

Java の SimpleDateFormat を使用して Active Directory から日付を解析すると、不可解な問題が発生します。日付が誤って 1 月に変換されます。この矛盾に興味をそそられたので、問題を例示するコード スニペットを詳しく調べてみましょう。

<code class="java">private Date getParsedDate(String givenString) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/DD");
    try {
        return sdf.parse(formattedString);
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
    return null;
}</code>

このコードを AD 日付値 "20050912190509.0Z" で実行すると、予期しない出力が得られます。

Value from AD is: 20050912190509.0Z
Formatted String is: 2005/09/12
Final date string is: Wed Jan 12 00:00:00 EST 2005

日と年は正確に識別されますが、月は常に 1 月と間違われます。この明白なエラーを引き起こす、一見単純なコードの中にどのような秘密があるのでしょうか?

その答えは、SimpleDateFormat パターン文字列の微妙な見落としにあります。 「yyyy/MM/DD」を指定すると、誤って月の形式が大文字の「MM」になってしまいます。ただし、Active Directory の日付値では、月には小文字の「mm」が使用されます。

この問題を修正するには、パターン文字列を「yyyy/MM/dd」に調整し、日には小文字の「dd」を使用します。

<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");</code>

この小さな変更を加えることで、SimpleDateFormat は Active Directory からの日付を正しく解釈し、正しい月を含む最終日付文字列をレンダリングします。

Value from AD is: 20050912190509.0Z
Formatted String is: 2005/09/12
Final date string is: Wed Sep 12 00:00:00 EST 2005

この修正により、Java の SimpleDateFormat が正確に解析されるようになります。 Active Directory から日付を取得できるため、自信を持って履歴データを操作したり、特定の日付範囲に基づいてレポートを作成したりできます。

以上がJava SimpleDateFormat が西暦の日付を 1 月 (yyyy/MM/DD と yyyy/MM/dd) に変換するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。