2015-11-18 4 views
2

У меня есть проблема с двумя частями, или, возможно, это два разных способа решить эту проблему. Я получаю строку ISO как 2015-11-17T17: 10: 24-0800. Конечная цель состоит в том, чтобы отобразить строку как 11/17/15 5:10 PM в некотором HTML, создаваемом некоторым Freemarker. Строка, которую я получаю, может быть в любом часовом поясе, но мне всегда нужно отображать строку в ее локальном часовом поясе, как показано выше. В настоящее время наш код был просто принимать строку и передать его в шаблон и coverting как таковой:Joda ISODateTimeFormat не использует часовой пояс в String

<#assign mydate = obj.mydate?datetime("yyyy-MM-dd'T'HH:mm:ssz")?string.short> 

Это уже не хорошо, так как я считаю, Freemarker использует локальный часовой пояс системы и теперь мы получаем больше, чем один часовой пояс. Я вижу, что существует метод iso в freemarker. Поэтому я стараюсь

<#assign order_date = order.order_date?iso("yyyy-MM-dd'T'HH:mm:ssz")> 

, но я получаю сообщение об ошибке:

For "?iso" left-hand operand: Expected a date, but this evaluated to a string 

Ok мне нужна дата. Работа с Joda, я пытаюсь создать объект типа DateTime по:

DateTime dateTime = ISODateTimeFormat.dateTimeNoMillis().parseDateTime("2015-11-17T17:10:24-0800"); 

Но, как представляется, использовать мой местный часовой пояс, а также и показывает 2015-11-17T20: 10: 24.000-05: 00. Я знаю, что могу делать с Zone (...), но я не знаю, кроме зоны -0800, или какой-либо другой зоны в конце строки. Поэтому я уже не понимаю, что делать. О, и я не могу изменить формат строки, которую я получаю.

+0

FreeMarker отображает 'java.util.Date'-s с часовым поясом, указанным в настройке' time_zone'. Локальный часовой пояс сервера только по умолчанию. Кроме того, при разборе дат, содержащих часовой пояс, текущий часовой пояс не соответствует. '? iso', как четко указано в документации, предназначено для форматирования дат, а не для их разбора. '? datetime' предназначен для парсинга дат, а также может анализировать даты ISO (см. документацию). – ddekany

+0

Спасибо за дополнительное разъяснение. В итоге я использовал параметр time_zone. Мне было трудно понять различную цель iso. – Michael

ответ

3
DateTime dateTime = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed().parseDateTime("2015-11-17T17:10:24-0800"); 

Это создаст DateTime с фиксированным смещением часового пояса -08:00.

+0

Мой герой! Большое вам спасибо, сэр. – Michael

0

Может потребоваться немного больше работы, но вы всегда можете использовать DateTimeFormatterBuilder, чтобы создать свой собственный пользовательский экран для даты времени. Таким образом, вы можете отбросить TimeZone, если хотите, и сделать его в течение этого TimeZone или визуализировать локально.

+0

Ограничено Java 7 на данный момент, я боюсь. Также стараюсь использовать ручные решения, например, как последнее средство. Честно говоря, я готов просто разобрать строку и даже не перейти к объекту даты. – Michael

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