web-dev-qa-db-ja.com

date.getTime()がUTC時間を返すようにする方法は?

UTC時間を表すDateオブジェクトがあります。 getTime()メソッドを使用してこのオブジェクトのlong値を取得すると、返される値は現地時間(米国中部)に対応します。元のUTC時間に対応する値を取得する正しい方法は何ですか?

ありがとう

19
flyingfromchina

Java.util.Dateにはタイムゾーンの概念はありません。 1970年1月1日00:00:00 UTCであるエポックに関連する時間を保持するだけです。日付は、ビューとは別のモデルです。日付を表示すると、タイムゾーンの概念が適用されます。日付のtoString()は、デフォルトのタイムゾーンで人間が読める日付を表示します。 DateFormatを使用して別のタイムゾーン(UTCなど)で日付を表示するか、JVMのデフォルトのタイムゾーンを変更できます。

23
Steve Kuo

DateFormatクラスには お好みのタイムゾーンを設定するためのメソッド があり、 TC時間の設定 を持つタイムゾーンクラスがあります。

たとえば、

SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
Date yourUtcDate = sdf.parse(yourOriginalDate);
22
Pops

tl; dr

_Instant.now()
_

…そして…

_Instant.ofEpochMilli( n ) 
_

…そして…

_instant.toEpochMilli()
_

Dateは常にUTCです

GetTime()メソッドを使用してこのオブジェクトのlong値を取得すると、返される値は現地時間(米国中部)に対応します。

いいえ、 Date::getTime() から返される値は常に [〜#〜] utc [〜#〜] に対応します(これは実質的にGMTと同じものです)環境)。クラスのドキュメントを引用するには:

このDateオブジェクトによって表される1970年1月1日00:00:00 GMT以降のミリ秒数を返します。

したがって、あなたの質問は、DateがすでにUTCにあるという意味で無意味です。 「元のUTC時間に対応する値を取り戻す」必要はありません。

getTimeの動作とtoStringメソッドの動作を混同している可能性があります。 toStringメソッドは、文字列を生成するプロセスで現在のデフォルトのタイムゾーンを煩わしく混乱させて適用します。そのため、実際にはDate自体から設定または取得するタイムゾーンはありませんが、文字列出力にはタイムゾーンが表示されます。 (実際にはDateの奥にゾーンがありますが、この議論とは無関係です。このクラスは混乱を招く混乱です!)

Java.time

これを行う最新の方法は、Java.timeクラスを使用することです。

Instant

Instant クラスは、 [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表します。解像度は nanoseconds (小数部の最大9桁)。

現在の瞬間を取得します。

_Instant instant = Instant.now();
_

古いdate-timeクラスに追加された新しい変換メソッドの1つを呼び出すことにより、Dateを最新の置換に変換できます。 toInstantを呼び出すだけで、非常に簡単です。

_Instant instant = myJavaUtilDate.toInstant();  
_

時間を追跡する方法としてエポックからのカウント数を使用することはまったくお勧めしません。代わりにJava.timeオブジェクトを使用してください。 Javaの外部では、テキストにシリアル化するときに ISO 8601 形式を使用します。

ただし、必要に応じて、1970-01-01T00:00:00Zのエポック以降のミリ秒数を抽出できます。これにはデータの損失が伴う可能性があることに注意してください! Instantの解像度はナノ秒です。そのため、ミリ秒単位になると、1秒の何分の1かが切り落とされる場合があります。

_long millisecondsSinceEpoch = instant.toEpochMilli();  // Caution: Possible data-loss in going from nanoseconds to milliseconds.
_

カウントからInstantへの反対方向へ。

_Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch ) ;
_

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- _Java.util.Date_Calendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および SE 7
  • Android
    • ThreeTenABP プロジェクトは適応しますThreeTen-Backport(上記)Android具体的に。
    • 使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter などの便利なクラスがあります。 、および more

21
Basil Bourque

getTime()は、「1970年1月1日00:00:00 GMT以降のミリ秒数」を返します。好きなようにフォーマットできます。 GregorianCalendar(TimeZone)コンストラクター。

7

Dateクラス関数のほとんどは、Calendarクラスでシフトされるため、非推奨です。

以下は、カレンダーからUTC時間を取得するコードです。

Date date = new Date(timeStamp);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
calendar.setTime(date);

年、月などを取得するサンプルコードを次に示します。

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));

カレンダーは、TIME、DAY_OF_MONTHなどのような他の多くの有用な情報もサポートしています。ここでは documentation それらのすべてをリストしています。月は0に基づいていることに注意してください。 1月は0番目の月です。

0
Amol Dixit