フォーマッターに文字列を解析させる
問題は「dateToIso」メソッドです。その必要はありません。DateTimeFormatterオブジェクトの仕事は、正しい形式が指定されたときに文字列を解析することです。あなたは確かに正しいフォーマットを与えました。そして、文字列を別の形式にモーフィングしました。
解決策: (a) dateToIso メソッドを強制終了します。(b) そのメソッドへの呼び出しを削除します。元の文字列を に渡すだけparseDateTime
です。
副次的な問題: タイム ゾーンの問題を無視しました。したがって、その文字列を解析するとき、Joda-Time はその日時のイベントが JVM のデフォルト タイム ゾーンで発生したと想定します。したがって、この同じコードを同じ入力で実行しますが、タイムゾーン設定が異なる別のコンピューター/JVM で実行すると、出力が異なります。おそらくあなたが望むものではありません。教訓: デフォルトに依存するのではなく、常にタイムゾーンを指定してください。
さらに別の問題: あなたが引用したエラーは、Joda-Time から Google 時間に変換する別の問題です。読む。
ドキュメントを読む
org.joda.time.DateTime
オブジェクトをオブジェクトに変換しようとしている場合は、 JavaDoccom.google.api.client.util.DateTime
を見てください。Google DateTime のコンストラクターが java.util.Date を受け取ることがわかります。Joda-Time には、他のクラスとの相互運用性のために java.util.Date オブジェクトに変換する組み込みメソッドがあります。toDate
食物連鎖
次のようなオブジェクトの食物連鎖を作成します。
org.joda.time.DateTime → java.util.Date → com.google.api.client.util.DateTime
テストされていないコード…</p>
org.joda.time.DateTimeZone = org.joda.time.DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( timeZone );
// Convert from Joda-Time to old bundled j.u.Date
java.util.Date juDate = jodaDateTime.toDate();
// Convert from j.u.Date to Google Date.
com.google.api.client.util.DateTime googleDateTime = new com.google.api.client.util.DateTime( juDate );
ミリ秒
または、ミリ秒を抽出して渡すこともできます。
一般的に、可能な限りミリ秒を直接扱うことは避けることをお勧めします。ミリ秒を使用すると、混乱し、ずさんで、エラーが発生しやすくなる可能性があります。ミリ秒数のデバッグは困難です。人間はlong
. Joda-Time と java.util.Date は、内部の時間追跡メカニズムとして milliseconds-since-Unix-epoch を使用していますが…
他の方向に行く
[次のセクションでは、Google が質問で参照されている API を新しい API に置き換えたと想定しています。この仮定が正しいかどうかはわかりません。]
com.google.gdata.data.DateTimeオブジェクトから Joda-Time DateTime に移行する場合、メソッドによって提供されるミリ秒単位の count-from-epoch を使用しますgetValue
。long
32 ビットではなく64 ビットを返すことに注意してくださいint
。
JVM の現在のデフォルト タイム ゾーンDateTime
を暗黙的に割り当てるのではなく、必要なタイム ゾーンを Joda-Time に割り当てるようにしてください。
long millisecondsFromUnixEpoch = myGoogleDateTime.getValue();
org.joda.time.DateTimeZone zone = DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( millisecondsFromUnixEpoch, zone );
Google API には他にもいくつかの選択肢があります。
toStringRfc822
このメソッドを呼び出して、toStringRfc822
Joda-Time によって解析される文字列を生成できます。残念ながら、RFC 822 は扱いにくく、解析が曖昧です。他の障害の中でも、適切なタイム ゾーン名ではなく、非標準の非一意の 3 ~ 4 文字のタイム ゾーン コードを使用しています。Joda-Time は、あいまいさのため、これらのコードの解析を試みることを拒否します。Google は、古い API/ライブラリとの下位互換性のためにここに含まれているだけだと思います。最新のインターネット プロトコルは、ISO 8601 に移行しました。
toUiString
おそらく、このtoUiString
メソッドを呼び出して、Joda-Time によって解析される文字列を作成できます。残念ながら、彼らのドキュメントでは、そのメソッドで使用される形式を説明していません。
toString
toString
文字列を生成すると記載されているメソッドを呼び出すことができxs:dateTime
ます。ドキュメントでは正確に説明できていませんが、XML スキーマ仕様に ISO 8601 が含まれていることを意味していると思います。このメソッドを試して、何が生成されるかを確認してください。Google オブジェクトに埋め込まれた UTC からのオフセットを保持したい場合に便利です。ただし、タイム ゾーンは UTC からのオフセット以上のものであるため、Joda-Time の DateTime オブジェクトに目的の/予想されるタイム ゾーンを割り当てる必要があります。long
したがって、これがエポックからのカウントを Joda-Time DateTime のコンストラクターに渡すよりも優れているかどうかはわかりません。
java.time
Java 8がリリースされたので、おそらく Google はその API をモダナイズして java.time パッケージを使用する可能性があります。
java.time は ISO 8601 形式を拡張して、タイム ゾーンの正式な名前を追加することに注意してください。これは非常に役立つアイデアです。