2

以下のルーチンを使用して、日付をyyyyMMddHHmmフォーマットで検証しています。このルーチンは、hour = 02を除くすべての場合に機能します。たとえば、次の場合に機能201203110000201203110100ます201203112300

私は何が欠けていますか?これはSimpleDateFormatの有効なバグですか、それともクラスが正しく機能するように形式を明示的に設定する必要がありますか。JDK1.6.0_24を使用しています。

public static void main(String[] args)
{
    SimpleDateFormat dateUtil = new SimpleDateFormat();
    Date parsedDT = null;
    String dateVal = "201203110200";
    String dateFormat = "yyyyMMddHHmm";
    dateUtil.applyPattern(dateFormat);
    try
    {
        parsedDT = dateUtil.parse(dateVal);
        if (!dateUtil.format(parsedDT).equals(dateVal))
        {
            System.err.println("error");
        }
        else
        {
            System.err.println("pass");
        }
    }
    catch (Exception exp)
    {
        exp.printStackTrace();
    }
}
4

1 に答える 1

6

のタイムゾーンを指定しておらず、現在のタイムゾーンSimpleDateFormatはわかりませんが、それが問題の原因であると強く疑っています。コードを次のように変更すると、問題を確実に再現できます。

SimpleDateFormat dateUtil = new SimpleDateFormat();
dateUtil.setTimeZone(TimeZone.getTimeZone("America/Chicago"));

少なくとも一部の場所(米国を含む)では、2012年3月11日は時計が進んだときでした。たとえば、シカゴでは、午前2時は実際には発生しませんでした。現地時間は行きました:

01:59:58
01:59:59
03:00:00

Javaでは、発生したことのない日付/時刻を解析しようとしたときに何が起こるかについてはあまり制御できませんが、同じ不可能な値が戻らないことは少なくとも驚くことではありません。午前2時は遷移なしで行われ、たとえば201203110300としてフォーマットされます。

どのように修正する必要があるかについては、このデータがどこから来ているのか、またはどのタイムゾーンから来ていると見なす必要があるのか​​が明確ではありません。おそらく、フォーマットのタイムゾーンをUTCに設定する必要があります...わかりません。

また、よりもはるかに優れた日時APIとしてJodaTimeを使用することを強くお勧めしますjava.util.*

于 2012-11-01T06:54:07.227 に答える