UTC時間を表すDateオブジェクトがあります。 getTime()メソッドを使用してこのオブジェクトのlong値を取得すると、返される値は現地時間(米国中部)に対応します。元のUTC時間に対応する値を取得する正しい方法は何ですか?
ありがとう
Java.util.Date
にはタイムゾーンの概念はありません。 1970年1月1日00:00:00 UTCであるエポックに関連する時間を保持するだけです。日付は、ビューとは別のモデルです。日付を表示すると、タイムゾーンの概念が適用されます。日付のtoString()は、デフォルトのタイムゾーンで人間が読める日付を表示します。 DateFormat
を使用して別のタイムゾーン(UTCなど)で日付を表示するか、JVMのデフォルトのタイムゾーンを変更できます。
DateFormat
クラスには お好みのタイムゾーンを設定するためのメソッド があり、 TC時間の設定 を持つタイムゾーンクラスがあります。
たとえば、
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
Date yourUtcDate = sdf.parse(yourOriginalDate);
_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クラスを使用することです。
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 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- _Java.util.Date
_ 、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがあります。 、および more 。
getTime()
は、「1970年1月1日00:00:00 GMT以降のミリ秒数」を返します。好きなようにフォーマットできます。 GregorianCalendar(TimeZone)
コンストラクター。
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番目の月です。