2013-08-23 6 views
1

После недели, пройдя столько примеров и переместившись с Java Date, в Календарь, в Joda. Я решил обратиться за помощью из других источников.Joda DateTime ,, Форматирование и Mysql Timestamp

Проблема:

Наша таблица имеет два поля Date (Отметка) и TZ (String). Идея состоит в том, чтобы хранить UTC пользователя в timestamp, и часовой пояс, ну, вы получите эту идею. Поэтому в основном мы думаем, что в UTC, и предоставить пользователю время конвертируются в часового пояса на передней части (то есть, с помощью хранилища ценностей в table.TZ)

Другим требованием является использование правильного объекта (дата , DateTime независимо). И не передавать строковое представление даты вокруг. Лучше всего было бы быть действительным долго, что будет правильно переведено MySQL, без использования для использования функции mysql FROM_UNIXTIME в нашем запросе.

код мы используем:

public DateTime convertTimezone(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) { 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withLocale(l); 

DateTime srcDateTime = date.toDateTime(srcTZ); 
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ); 

System.out.println(formatter.print(dstDateTime)); 
System.out.println(formatter.parseDateTime(dstDateTime.toString())); 


return formatter.parseDateTime(formatter.print(dstDateTime)); 
} 

Вывод строки именно то, что нам нужно (т.е. время UTC, 2013-08-23 18:19:12), но formatter.parseDateTime(dstDateTime.toString() разваливается следующим ошибка. Вероятно, из-за UTC часовой пояс независимой информации и milleseconds ?:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "2013-08- 23T18:19:12.515Z" is malformed at "T18:19:12.515Z" 
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:873) 
at com.example.business.rate.RateDeck.convertTimezone(RateDeck.java:75) 
at com.example.business.rate.RateDeck.WriteData(RateDeck.java:143) 
at com.example.business.rate.RateDeck.main(RateDeck.java:64) 

поиска обогащается вопрос:

Как форматировать UTC для Joda DateTime.

PS Мой первый пост, и он чувствует себя хорошо? :)

Спасибо заранее,

Новая Исправленная версия:

public Timestamp convertTimezone(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) { 
DateTime srcDateTime = date.toDateTime(srcTZ); 
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ); 
return new Timestamp(dstDateTime.getMillis()); 
} 

Ник.

ответ

4

Это просто сбой, потому что формат проанализированной строки не соответствует формату форматирования.

Форматировщик разбирает с использованием формата yyyy-MM-dd HH:mm:ss, и toString() метода DateTime форматирует дату его с помощью (as documented) в ISO8601 формате (YYYY-MM-ДДTчч: мм: ss.SSSZZ).

+0

Спасибо, но не является форматировщиком, отвечающим за изменение формы изображения независимо? Я не уверен, что следую: S. Я вижу, что вы говорите, меняя форматтер на «yyyy-MM-dd'T'HH: mm: ss.SSSZZ», останавливает сбой и выводит правильный UTC »2013-08-23T21: 28: 04.290 + 00: 00 ", нам нужно, чтобы формат DateTime находился в« yyyy-MM-dd HH: mm: ss ». –

+0

Форматирует форматирует DateTime как String, когда вы просите об этом, используя 'formatter.prin (theDateTimeToFormat)'. Но вы этого не сделаете. Вы вызываете 'DateTime.toString()', чтобы преобразовать DateTime в String. Я действительно не понимаю, что вы хотите делать с этими заявлениями System.out.println BTW. –

+0

DateTime не имеет никакого формата. Это число миллисекунд и идентификатор часового пояса. Только это. Когда вы преобразуете это значение в String, вы можете выбрать, какой формат использовать, благодаря DateTimeFormatter. Метод toString() преобразует DateTime в строку, используя формат ISO8601. –

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