JDKとjoda-time dateformatter:日中の節約時間を考慮する方法

@ Jon Skeet、あなたが推奨するようにJoda-Timeをダウンロードしました。
TimeZoneとSimpleDateFormatを使用した日付解析/書式設定は、DSTスイッチ
で異なる結果を出し、Java
EE/JSFプロジェクトに追加し、DateTimeとDateTimeFormatterを使用しようとしました.JDKと同じ結果を返しています6(以下を参照)は、ESTタイムゾーン(米国/東部)で今ここで昼間の節減になっているためです。

ORDER#0739旅行日2011/11/11 2011年11月12日お客様番号#1004

Trip Date/Time: 11/11/2011 05:00 PM Report Date/Time: 11/11/2011
04:45 PM Return Date/Time: 11/13/2011
02:00 AM

コードは次のとおりです。

public String getDateFromDateTime (Date date, Boolean display) throws ParseException {

    /*
     * SimpleDateFormat working as designed, but pf_ordersController.selected.returnDateTime displaying incorrect date/time
     * 
     * see below from /orders/pf_View.xhtml
     * pf_ordersController.selected.returnDateTime (displayed on JSF page) = 11/13/2011 02:00 AM
     * 
     * ORDER #  0739  Trip Date 11/11/2011 to 11/12/2011  Customer # 1004
     * 
     * Trip Date/Time: 11/11/2011 05:00 PM  Report Date/Time: 11/11/2011 04:45 PM   Return Date/Time: 11/13/2011 02:00 AM
     * 
     * orders.returnDateTime (stored in database) = 11/12/2011 21:00:00 (9:00 PM)
     * SimpleDateFormat converts orders.returnDateTime to 11/12/2011 (working as designed)
     * 
     * https://stackoverflow.com/questions/2356672/date-parsing-formating-with-timezone-and-simpledateformat-problem-around-dst-swi
     * 
    DateFormat formatter;
    String myDate;

    if (display)
        formatter = new SimpleDateFormat("MM/dd/yyyy");
    else
        formatter = new SimpleDateFormat("yyyy-MM-dd");

    myDate = formatter.format(date);
     * 
     */

    DateTimeFormatter dtFormatter;

    if (display)
        dtFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");
    else
        dtFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");

    DateTime dt = new DateTime(date);
    String myDate = dt.toString(dtFormatter);

    System.out.println("OrderDisplayUtil.java:getDateFromDateTime(" + date + ", " + display + "): " + "myDate = " + myDate);

    return myDate;

}

助けてください。ありがとう。

ベストアンサー

あなたの方法に伴う問題についてのあなたの説明を特定してください。あなたの入力値はあなたの出力値として何を期待していますか?開発者は、これをテストの形で表現する必要があります。

@Test
public void testGetDateFromDateTime() {
    DateTimeZone timezone = DateTimeZone.forID("US/Eastern");
    Date date = new DateTime(2011, 11, 11, 17, 0, 0, 0, timezone).toDate();

    String formattedDate = unitUnderTest.getDateFromDateTime(date, true);

    Assert.assertEquals(formattedDate, "11/11/2011");
}

日付を書式設定するタイムゾーンを明示的に指定していないという問題があります。この場合、Javaは、JVMを実行しているオペレーティングシステムで設定されたタイムゾーンを使用します。たとえば、+08:00のタイムゾーンを使用して、シンガポールで稼働しているシステムで、米国/イースターの日付/時刻2011/11/11
16:45の書式を設定する場合は、システムは日付/時刻を正確に同じ時刻を表す2011/11/12
06:00と解釈します。システムはフォーマッタを使用し、’11/12/2011 ‘を与えます。

この問題は、使用するタイムゾーンを指定して解決してください。

public String getDateFromDateTime(Date date, Boolean display) {

    DateTimeFormatter dtFormatter;

    if (display)
        dtFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");
    else
        dtFormatter = DateTimeFormat.forPattern("yyyy-MM-dd");

    DateTimeZone timeZone = DateTimeZone.forID("US/Eastern");
    DateTime dt = new DateTime(date, timeZone);
    String myDate = dt.toString(dtFormatter);

    return myDate;
}

また、米国の夏時間は11月6日に終了しました。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です