2016-07-26 6 views
1

У меня есть код нижеwithZone (DateTimeZone.UTC) из DateTimeFormatter изменения значения даты

final DateTimeFormatter COMBINED_FORMAT = ISODateTimeFormat.dateTimeParser().withZone(
       DateTimeZone.UTC); 
     System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000").toDate()); 

Результат вс 1 апреля 5:30:00 IST 2012 Я ожидаю, что это вернуть Sun 01 апреля 00:00:00 IST 2012

Как это получить?

+1

Если вы ждете часовой пояс, чтобы быть IST почему вы используете UTC? Что произойдет, если вы используете часовой пояс IST? Если вы находитесь в часовом поясе IST, почему вы устанавливаете его вообще? –

+0

Вы вызываете 'toDate()' в разобранном 'DateTime', который возвращает' java.util.Date'; когда вы печатаете это, он всегда печатается в вашем местном часовом поясе. Обратите внимание, что 'java.util.Date' не запоминает информацию о часовом поясе. – Jesper

+0

"Стандартное время Индии (IST) на 5:30 часов больше, чем в скоординированном универсальном времени". от http://www.timeanddate.com/time/zones/ist. ;) – Ephi

ответ

2

Во-первых, вы не должны использовать java.util.Date.toString() (неявно используемый в вашем примере) для оценки результата. Причина заключается в том, что ее запутанное поведение всегда выводится в системном часовом поясе, а не в реальном состоянии вашего результата.

Во-вторых: если вы установили зону в UTC, вы даете команду вашему парсеру интерпретировать строку без полей «2012-04-01T00: 00: 00.000» в качестве UTC, а не как IST. Просто посмотрите на состояние вашего результата:

DateTimeFormatter COMBINED_FORMAT = 
    ISODateTimeFormat.dateTimeParser().withZone(DateTimeZone.UTC); 
System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000")); 
// 2012-04-01T00:00:00.000Z 

Однако, если вы хотите, чтобы результат "Sun Apr 01 00:00:00 IST 2012" (выход Date.toString()) или эквивалент: " 2012-04-01T00: 00: 00 + 05: 30 ", тогда вы должны проинструктировать синтаксический анализатор для интерпретации ввода как IST, а не UTC.

Решение:

DateTimeFormatter COMBINED_FORMAT = 
    ISODateTimeFormat.dateTimeParser().withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000")); 
// 2012-04-01T00:00:00.000+05:30