13

いくつかのテストを実行しているときに、次の問題に遭遇しました。使用する場合:

private String printStandardDate(Date date) {
    return DateFormat.getDateTimeInstance(
        DateFormat.SHORT, DateFormat.SHORT).format(date);
}

テストが実行された場所に応じて、これによって異なる形式の日付が生成されることがわかりました。したがって、ローカルでWindows / eclipseで結果が得られました:04/02/12 18:18ですが、アメリカのLinuxボックスでは2/4/126:18PMになります。

これにより、テスト/ビルドが失敗します。

期待:<[04/02/12 18:18]>しかし、だった:<[2/4/12 6:18 PM]>

誰かがこの振る舞いを説明できますか?

4

2 に答える 2

20

それは奇妙ではありません。まさにそのように機能するはずです。

の API ドキュメントにDateFormat.getDateTimeInstanceは次のように書かれています。

既定のロケールの指定された日付と時刻の書式設定スタイルを持つ日付/時刻フォーマッタを取得します。

デフォルトのロケールは、Windows システムとアメリカの Linux ボックスでは異なります。

日付と時刻の形式を正確に制御したい場合は、SimpleDateFormat自分で形式を使用して指定します。例えば:

private String printStandardDate(Date date) {
    return new SimpleDateFormat("dd/MM/yy HH:mm").format(date);
}

オブジェクトを再利用するのはさらに良いことSimpleDateFormatですが、スレッドセーフではないことに注意してください (メソッドが複数のスレッドから同時に呼び出される可能性がある場合、それらのスレッドが同じSimpleDateFormatオブジェクトを使用すると、問題が発生します)。

private static final DateFormat DATE_FORMAT =
    new SimpleDateFormat("dd/MM/yy HH:mm");

private String printStandardDate(Date date) {
    return DATE_FORMAT.format(date);
}
于 2012-07-03T14:21:16.273 に答える
11

形式は、コードの既定のロケールに基づいています。結果を確実にしたい場合は、必ず特定のロケールを使用する必要があります。このメソッドは、パラメーターとして使用するロケールを受け取る代替メソッドgetDateTimeInstanceを提供するためにオーバーロードされています。

public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)

両方のテスト環境で同じロケールを使用すると、結果は同じになります。

于 2012-07-03T14:21:37.913 に答える