2011-11-13 57 views
0

@Jon Skeet,我按照你的建議在Date parsing/formatting with TimeZone and SimpleDateFormat give different results around DST switch下載了Joda-Time,並將它添加到我的Java EE/JSF項目中,試圖使用DateTime和DateTimeFormatter ,並且他們返回的結果與JDK 6相同(見下文),因爲現在在美國東部時區(美國/東部)這裏是日光節約。JDK和joda-time dateformatter:如何考慮日光節約時間

ORDER#0739旅行日期11/11/2011到2011/11/12客戶#1004

旅行日期/時間:11/11/2011 05:00 PM 報告日期/時間:11 /二千零十一分之十一下午4時45 返回日期/時間:2011年11月13日上午02點00

代碼如下:

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; 

} 

請幫忙。謝謝。

+0

結束至於廣州澳凌說,我們需要知道你是怎麼得到你的意見。我不介意它是以單元測試的形式還是簡單但完整的控制檯應用程序,但是我可以以任何方式運行:) –

+0

@JonSkeet,感謝您的快速響應。我剛剛證實SimpleDateFormat按照設計工作,因爲問題日期/時間是傳遞給此方法的Orders.returnDateTime,getDateFromDateTime(Orders.returnDateTime,...)。 Orders.returnDateTime = 2011-11-12 21:00:00,但由於某種原因,我的JSF /控制器代碼顯示2011-11-13 02:00:00。我會繼續看這個。順便說一句,謝謝你讓我知道我該如何提問;我相信你已經可以告訴我,我是這裏的新手。 :) – Howard

+0

有關提問的更多建議,請參閱http://tinyurl.com/so-hints。這聽起來像你有很多轉換在你的代碼中進行。將它們一個接一個地分離出來,然後正確地解決問題所在。 –

回答

1

請詳細說明您的方法存在的問題。你的輸入值是什麼?作爲一名開發人員,您應該以測試的形式表達這一點。

@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日

+0

感謝您的答覆/迴應和代碼修改/建議。正如我上面提到的JonSkeet,我瞭解到SimpleDateFormat按照設計工作;我需要調試我的JSF /控制器邏輯並確認爲什麼Orders.returnDateTime不是這個訂單記錄/行的正確日期/時間。在其他地方,這個訂單。returnDateTime顯示正確,但不是當我通過OrdersController.selected.returnDateTime顯示日期時; xhtml按照其他行的設計工作,但不適用於此行。我應該在這裏更新這個問題嗎,因爲我之前說錯了?再次感謝。 – Howard

+0

哦,我忘了提及,目前,目標用戶最可能使用這個網絡應用程序在網絡防火牆後,爲我的家人。日期/時間值將始終基於在辦公室中使用Web應用程序的人員,因此localDateTime現在符合要求。老實說,我不能想到這個業務需求需要考慮TimeZone的用例。再次感謝。 – Howard

相關問題