1

私はチャットを持つアンドロイドアプリケーションを構築しています。
このチャットでは、各メッセージに署名を送信する時間があります。
私の質問は次のとおり
です。私の国での時間が X であるとしましょう。私の友人は海外にいて、彼の時間は X から 7 時間引いた時間です。現地時間
に彼にメッセージを送ります。 私は彼が署名されるメッセージを受け取るという状況を避けたいです(彼の国でその友人の目を見ているなら、それは将来のことです). 私の電話ではメッセージが と書かれ、彼の電話では と書かれる方法はありますか? 時間を現地時間に変換する方法はありますか?16:00
09:0016:00

16:0009:00

4

6 に答える 6

1

UTC 時間を使用して常に通信を維持する必要があります。次に、デバイスの現在のタイムゾーン設定に基づいて表示用にローカライズします。

于 2012-06-28T12:51:24.347 に答える
0

ここの答えを見てください:

https://stackoverflow.com/a/6094475/346232

時刻を UTC に変更してから、デバイスでタイムゾーンに変換する必要があります。

于 2012-06-28T12:54:41.657 に答える
0

java.util.Date/.Calendar を避ける

Java (および Android) にバンドルされている java.util.Date/.Calendar クラスは厄介で、設計と実装の両方に欠陥があることで有名です。

Joda-Time

Joda -Timeライブラリが最適です。このライブラリは、現在 Java 8 に組み込まれている java.time パッケージに影響を与えました (Android では使用できません)。

UTC

他の回答が示唆しているように、(一般的に) ベスト プラクティスは、ビジネス ロジックとデータ ストレージ/通信をUTCタイム ゾーン (タイム ゾーンなしまたは「アンチ」タイム ゾーンと考える人もいます) に保つことです。ユーザーまたはデータ消費者が期待する場合にのみ、特定のタイム ゾーンに調整します。

タイムゾーン

Joda-TimeのDateTimeクラスは、割り当てられたタイム ゾーンと共に日時の値を表します。

すべての操作でタイム ゾーンを指定することをお勧めします。そうしないと、暗黙的に JVM の現在のデフォルトのタイム ゾーンに依存することになります。アプリの JVM 内で実行されている任意のアプリの任意のスレッド内の任意のコードによって、いつでも実行時であっても、そのゾーンが変更される可能性があるため、これは危険です。また、3 ~ 4 文字のコードではなく、適切なタイム ゾーン名を使用してください。

サンプルコード

Joda-Time 2.7 のサンプル コード。

DateTime sent = DateTime.now( DateTimeZone.getDefault() ) ;
DateTime sentUtc = nowMine.withZone( DateTimeZone.UTC ) ; // Generally, use this for your work, including communicating to other threads and apps and such.

他のユーザーに表示する準備ができたら、予想されるタイム ゾーンに調整します。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ) ;  // Or DateTimeZone.getDefault() if you want to rely on their JVM’s current default. To be absolutely sure of expected time zone, you really must ask the user.
DateTime sentMontréal = sentUtc.withZone( zone );

これらの日時オブジェクトのテキスト表現を生成するには、その件に関する StackOverflow.comの多くの質問と回答を検索してください。「joda」、「DateTimeFormatter」、「DateTimeFormat」などの用語を検索します。

于 2015-05-27T04:00:05.060 に答える
0

メッセージが保存されるタイムゾーンを保存し、それを転送する(またはUNIXエポック時間を送信する)必要があります。次に、ロケール時間でそれを読み取るようにしてください(物事についてはAndroidのドキュメントを使用してください)http://developer.android.com/reference/java/util/Calendar.htmlのように役立ちます)。

于 2012-06-28T12:51:32.137 に答える
0

long を使用して、時間情報を「エポック」(1970 年 1 月 1 日 00:00:00 GMT) からのミリ秒単位で保存します。メソッドで取得できDate.getTime()、新しい Date オブジェクトはDate(long millis)コンストラクターを使用して簡単に作成できます。Date オブジェクトは、各デバイスのローカル タイムゾーン設定を使用して表示されます。

編集:

エポックは定義された時点であり、異なるタイムゾーンで異なる方法で表現されます: 1970-01-01 00:00:00 GMTと 1969-12-31 19:00:00 EST . タイムスタンプは、その時間から経過したミリ秒数です。たとえば、タイムスタンプ1341169200は 2012-07-01 19:00:00 GMTおよび 2012-07-01 14:00:00 ESTに対応します。

于 2012-06-28T12:55:34.447 に答える