0

アプリで任意の時間を設定したい。locale時間はサーバーからミリ秒形式でダウンロードされます。他のシステム設定とは無関係である必要があります。しかし、アプリケーションはスレッド セーフ ソリューションを再取得し、スレッド セーフCalendarオブジェクトではなく標準のようなオブジェクトを取得します。

最善の方法は何ですか?

今日私は使用します:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(serverTime);

しかし、スレッドセーフではないため、私にとっては良い方法ではありません。

tl;dr プログラムには、外部サーバーから時間を取得する独自の内部クロックが含まれている必要があります。クロックはスレッドセーフでなければなりません。

4

3 に答える 3

1

Java アプリケーションが使用するミリ秒単位の時間は

「エポック」として知られる標準基準時、つまり 1970 年 1 月 1 日 00:00:00 GMT からの指定されたミリ秒数。

この数値は、GMT タイム ゾーンに基づいています。別のタイムゾーンで印刷する必要がある場合は、必要な書式設定クラスを使用できますSimpleDateFormat。それを保持する変数をスレッドセーフにする必要がある場合は、おそらくクラスでラップすることによって、変数を同期するだけです。

public class TimeInMillis {
    private volatile long time;

    public void setTime(long time) {this.time = time;} 

    public time getTime() {return time;}
}

表示する必要があるときはいつでも、TimeInMillisオブジェクトを取得し、 を取得して、timeそれを使用してオブジェクトを作成しCalendarます。次に、書式設定クラスを使用して、必要な書式、ロケール、タイムゾーンで時刻を出力します。

于 2013-09-08T21:04:39.960 に答える
0

時間はミリ秒形式でサーバーからダウンロードされます。ロケールやその他のシステム設定から独立している必要があります。

それは「時間」ではありません。これはタイムスタンプであり、特定の時点で特定のソフトウェアによって報告された特定の時間値を意味します。

ここで、このサーバーとの将来の通信で、デバイスによって報告された時間をサーバーが認識している時間ベースに変換したいと考えている場合、それは少なくとも少しは理にかなっています。その場合、タイムスタンプを受信したときのデバイス時刻と、タイムスタンプ自体の時刻値との間のデルタを計算します。次に、サーバーに報告する将来の時間にそのデルタを適用します。

プログラムには、外部サーバーから取得する独自の内部クロックが含まれている必要があります

それはまったく意味がありません。

この宇宙では、現在の物理学の知識に基づいて、時間は連続的で直線的です。「外部サーバーから時刻を取得」しているときだけ時刻は変わりません。繰り返しますが、「外部サーバーから取得している」のはタイムスタンプです。これは、リクエストを行った時点でサーバーの時計が何を考えていたかを示すステートメントです。そのタイムスタンプをそのサーバーの他のタイムスタンプと比較する目的で使用できます。また、そのタイムスタンプを使用してデバイスの現在の時刻と比較し、差を判断できます。

ただし、Java コードでハードウェアを作成することはできないため、Java コードで「内部クロック」を作成することはできません。唯一のクロックはデバイスのクロックです。前述のように、前述の違いを適用することで、デバイスのクロックの時刻をサーバーのタイムベースに変換できますが、時間の経過は依然としてデバイス自体のクロックによってマークされています。

違いは or になるため、複数のスレッドが一度に値を処理することが懸念される場合は、intorlongを使用できます。AtomicIntegerAtomicLong

于 2013-09-08T21:24:36.107 に答える
-1

I would just the the time in milli-second with GMT (BTW computers don't support UTC as such)

long serverTime = System.currentTimeMillis(); // millis since 1/1/1970 GMT.

To get/set this in a thread safe manner you can make it volatile

BTW Calender is pretty slow even on a PC. I would avoid using it on a phone.

于 2013-09-08T20:57:12.720 に答える