4

Google Tasks API に送信する必要がある日付/時刻文字列がありますが、Joda-TimeライブラリのDateTimeオブジェクトを Java DateTime オブジェクトに変換する方法がわかりません。プラットフォームとして Android を使用しています。

文字列は「2012/07/19 22:00:00」で始まり、最初に Iso 形式に変換されます。

これが私のコードです:

    Task task = new Task();
    task.setTitle(title);
    task.setNotes(note);        
    DateTimeFormatter formatter =  DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss");
    DateTime dt = formatter.parseDateTime(dateToIso("2012/07/19 22:00:00"));
    task.setDue(dt);    

private String dateToIso(String date) {
    date = date.replace("/", "-");
    date = replaceCharAt(date, 10, 'T');
    date = date + ".000Z";
    return date;
}

私が得ているエラーは次のとおりです。

「タイプの不一致: org.joda.time.DateTime から com.google.api.client.util.DateTime に変換できません」

手伝ってください。ISO 変換に関する情報も役立ちます。

4

1 に答える 1

3

フォーマッターに文字列を解析させる

問題は「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 を使用しますgetValuelong32 ビットではなく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

このメソッドを呼び出して、toStringRfc822Joda-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 形式を拡張して、タイム ゾーンの正式な名前を追加することに注意してください。これは非常に役立つアイデアです。

于 2014-02-12T09:54:13.910 に答える