非常に多くの例を見て、Java Date から Calendar、Joda に移行した 1 週間後。私は他の情報源に助けを求めることにしました。
問題:
このテーブルには、日付 (タイムスタンプ) と TZ (文字列) の 2 つのフィールドがあります。アイデアは、ユーザーの UTC をタイムスタンプとタイムゾーンに保存することです。したがって、基本的には UTC で考え、フロントエンドでタイムゾーンに変換された時刻をユーザーに提示します (つまり、table.TZ の値ストアを使用します)。
もう 1 つの要件は、適切なオブジェクト (Date、DateTime など) を使用することです。また、日付の文字列表現を渡さないでください。クエリで FROM_UNIXTIME mysql 関数を使用しなくても、MySQL によって正しく変換される有効な Long が最適です。
使用しているコード:
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 タイムゾーンに依存しない情報とミリ秒が原因でしょうか?:
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)
検索エンジン強化質問:
Joda DateTime の UTC をフォーマットする方法。
PS 私の最初の SO 投稿、いい感じですか? :)
前もって感謝します、
新しい修正バージョン:
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());
}
ニック。