2

非常に多くの例を見て、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());
}

ニック。

4

1 に答える 1