JDK и формат даты и времени: как учитывать летнее время - PullRequest
0 голосов
/ 13 ноября 2011

@ Джон Скит, я скачал Joda-Time, как вы рекомендовали в, Синтаксический анализ / форматирование даты с TimeZone и SimpleDateFormat дают разные результаты по переключению DST , и добавил его в мой проект Java EE / JSF, попытался использовать DateTime и DateTimeFormatter, и они возвращают тот же результат, что и JDK 6 (см. ниже), поскольку в настоящее время это дневное энергосбережение здесь, в часовом поясе EST (США / восток).

ЗАКАЗ # 0739 Дата поездки с 11/11/2011 по 11/12/2011 Заказчик # 1004

Дата / Время поездки: 11.11.2011, 17:00 Дата / время отчета: 11.11.2011 16:45 Возврат Дата / Время: 11/11 / 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)
     * 
     * /1915709/sintaksicheskii-analiz-formatirovanie-timezone-simpledateformat-raznye-rezultaty-otnoshenii-perehoda-letnee-vremya
     * 
    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;

}

Пожалуйста, помогите. Благодаря.

1 Ответ

1 голос
/ 13 ноября 2011

Пожалуйста, будьте конкретны с объяснением проблем, которые возникают у вас с вашим методом.Каковы ваши входные значения, которые ожидают в качестве выходных значений.Как разработчик, вы должны выражать это в форме теста.

@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.Например, если вы хотите отформатировать дату / время 2011/11/11 16:45 из США / Восточной системы в Сингапуре, используя часовой пояс +08: 00.Система будет интерпретировать дату / время как 2011/11/12 06:00, что представляет собой точно такой же момент времени.Затем система будет использовать средство форматирования и даст '11 / 12/2011 '.экономия времени закончилась 6 ноября.

...