2013-05-09 2 views
4

Я разбираю дату, которая поступает с информацией о часовом поясе, скажем: 1/7/2008 11:00:00 AM -0700. -0700 соответствует текущему смещению по времени здесь, в Калифорнии, так как мы сейчас находимся в PDT. Если я разобрать его и показать его:Как сохранить часовой пояс при разборе даты?

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z") 
    .parseDateTime("1/7/2008 11:00:00 AM -0700").toString() 

я получаю: 2008-01-07T10:00:00.000-08:00. Это «правильно», как 10am -0800 = 11 am -0700, но как я могу получить возвращенную дату для сохранения того же смещения времени (часть Z) У меня было на входе?

В качестве примечания стороны, используя java.text.SimpleDateFormat, дайте аналогичный результат: new SimpleDateFormat("M/d/yyyy hh:mm:ss a Z").parse("1/7/2008 11:00:00 AM -0700").toString() возвращает Mon Jan 07 10:00:00 PST 2008 и PST = -0800, а теперь мы находимся в PDT.

ответ

4

Дата, указанная вами в январе, которая была бы не была при дневном свете. Таким образом, смещение -0800 является правильным, если вы имели в виду, что эти времена должны быть в тихоокеанском времени.

Но вы не указали идентификатор часового пояса, например America/Los_Angeles, так почему JodaTime делает это предположение?

Ответ можно найти в the documentation для DateTimeFormatter класса:

Основополагающий принтер/анализатор может быть изменен, чтобы вести себя так же, как требуется, используя один из модификаторов декоратор:

withLocale(Locale) - возвращает новый форматтер, который использует указанный языковой стандарт
withZone(DateTimeZone) - возвращает новый форматтер, который использует указанный часовой пояс
withChronology(Chronology) - r eturns новый форматировщик, который использует указанный хронологию
withOffsetParsed() - возвращает новый форматчик, который возвращает разобранное смещение часового пояса
withPivotYear() - возвращает новый форматировщик с указанного годом шарнирного
withDefaultYear() - возвращает новый форматировщик с указанным годом по умолчанию

The documentation для метода DateTimeFormatter.forPattern() говорит:

формат может содержать локали специфический выход, и этот Wi Если вы измените язык форматирования, измените его. Вызовите DateTimeFormatter.withLocale (Locale), чтобы переключить язык.

Поскольку вы не хотите использовать определенный языковой или часовой пояс, я считаю, вы должны использовать следующее:

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z") 
     .withOffsetParsed() 
     .parseDateTime("1/7/2008 11:00:00 AM -0700").toString() 

См these docs за поведение .withOffsetParsed(), что это именно то, что вы спрашивать о.

Смежные вопросы