#java #scala #timezone #jodatime
#java #scala #Часовой пояс #jodatime
Вопрос:
Я анализирую временные метки. Они вынуждены использовать мой местный часовой пояс (Европа / Лондон), когда я их читаю. Вместо этого я хочу сохранить исходное смещение часового пояса.
scala> val fmt = org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis()
scala> val t = fmt parseDateTime ("2012-04-16T23:00:45-04:00")
t: org.joda.time.DateTime = 2012-04-17T04:00:45.000 01:00
scala> t.getDayOfMonth
res2: Int = 17
scala> fmt print t
res1: java.lang.String = 2012-04-17T04:00:45 01:00
В этом примере временная метка из Америки / New_York принудительно переносится в Европу / Лондон. Когда я преобразую DateTime обратно в строку, я хочу получить обратно исходную строку, которую я ввел.
Кроме того, когда я спрашиваю временную метку, с какого числа месяца она относится, я хочу, чтобы она говорила, что это с 16-го (потому что именно такая дата была в том месте, где она была сгенерирована), а не с 17-го (хотя именно такая дата была в моем часовом поясе в тот же момент).
Как мне это сделать?
Ответ №1:
Попробуйте создать DateTimeFormatter
с включенным синтаксическим анализом смещения. Это должно привести к тому, что анализируемые DateTime
объекты сохранят смещение от строки, которая была первоначально проанализирована.
Если это не сработает, возможно, вам потребуется сохранить часовой пояс отдельно. Затем, чтобы напечатать дату, вы извлекаете саму дату, и целевой часовой пояс. Установите в форматере желаемый часовой пояс и используйте его для форматирования даты.
Комментарии:
1. Никогда не знал, что их анализатор смещения будет отключен по умолчанию. Кажется странным, что ISODateTimeFormat ведет себя таким образом. Использование декоратора, описанного в документах, с помощью
ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(dateAsString);
решило мою проблему. Спасибо за ответ. joda-time.sourceforge.net/apidocs/org/joda/time/format /…