После недели, пройдя столько примеров и переместившись с 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());
}
Ник.
Спасибо, но не является форматировщиком, отвечающим за изменение формы изображения независимо? Я не уверен, что следую: 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 ». –
Форматирует форматирует DateTime как String, когда вы просите об этом, используя 'formatter.prin (theDateTimeToFormat)'. Но вы этого не сделаете. Вы вызываете 'DateTime.toString()', чтобы преобразовать DateTime в String. Я действительно не понимаю, что вы хотите делать с этими заявлениями System.out.println BTW. –
DateTime не имеет никакого формата. Это число миллисекунд и идентификатор часового пояса. Только это. Когда вы преобразуете это значение в String, вы можете выбрать, какой формат использовать, благодаря DateTimeFormatter. Метод toString() преобразует DateTime в строку, используя формат ISO8601. –