Javaでは、GMTで現在の時刻を取得します。
私はこのようなさまざまなオプションを試しました:
Date date = new Date();
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date1 = calendar.getTime();
しかし、日付は常に私のローカルタイムゾーンで解釈されます。
何が間違っているのですか?Java DateをGMTに変換するにはどうすればよいですか?
日付を取得する際にバックエンドで正しいことを行ったのは良いことですが、そのGMT時間を取らずにマシンの現在のロケールに従ってフォーマットしなかったことを示すものは何もありません。
final Date currentTime = new Date();
final SimpleDateFormat sdf =
new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z");
// Give it to me in GMT time.
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("GMT time: " + sdf.format(currentTime));
重要なのは、システムが提供するものではなく、独自のDateFormatを使用することです。これにより、DateFormatのタイムゾーンをロケールのタイムゾーンに設定する代わりに、希望するものに設定できます。
なぜ誰もこれをしないのだろうか:
Calendar time = Calendar.getInstance();
time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));
Date date = time.getTime();
更新:Java 8,9,10以降、Javaでサポートされているより良い代替手段があるはずです。コメントありがとうございます@humanity
私の経験から、JavaのバンドルされたCalendarおよびDateクラスは、望ましくない効果をもたらす可能性があります。Java 8へのアップグレードを気にしないなら、ZonedDateTime
そのようです:
ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC );
Instant.now()
Damilolaの Answer は、Java 8以降に組み込まれたJava.timeフレームワークを使用することを示唆しています。しかし、そのAnswerは、特定の時間ではなくUTCだけが必要な場合は過剰なZonedDateTime
クラスを使用しますゾーン。
面倒な古い日時クラスはレガシーであり、Java.timeクラスに取って代わりました。
Instant
Instant
クラスは、 [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表します。解像度は ナノ秒 (最大9桁の小数部分) )。
簡単なコード:
Instant instant = Instant.now() ;
instant.toString():2016-11-29T23:18:14.604Z
Instant
は、タイムゾーン(ZoneID
)を追加してZonedDateTime
を取得できるビルディングブロックと考えることができます。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacyJava.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクト、現在 メンテナンスモード )は、Java.timeへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、および more 。
GMTでミリ秒単位の時間を取得するために必要なのは
long millis = System.currentTimeMillis();
あなたもできる
long millis = new Date().getTime();
そして
long millis =
Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();
しかし、これらは同じ呼び出しを行う非効率的な方法です。
多くの方法を試した後、GMTでミリ秒単位の時間を取得するには、2つの別個のSimpleDateFormat
オブジェクトを作成する必要があります。1つはGMTでのフォーマット用で、もう1つは解析用です。
コードは次のとおりです。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = new Date();
SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateTime= dateParser.parse(format.format(date));
long gmtMilliSeconds = dateTime.getTime();
これは正常に機能します。 :)
最初に、不可能を求めています。昔ながらのDate
オブジェクトは、タイムゾーンまたはGMTオフセットを持つことができないため、取得していません。
しかし、日付は常に私のローカルタイムゾーンで解釈されます。
Date
を出力したか、暗黙的にtoString
メソッドを呼び出す何かを実行したと思います。 Date
がタイムゾーンで解釈されるのはこれが唯一の時間だと思います。より正確には、JVMの現在のデフォルトのタイムゾーンで。一方、これは避けられません。 Date.toString()
doesはそのように動作し、JVMのタイムゾーン設定を取得し、返される文字列のレンダリングに使用します。
ただし、Date
は使用しないでください。このクラスは設計が不十分で、幸いなことに古くなっています。また、Java.time、現代のJavaを置き換える日付と時刻のAPI、日付と時刻のクラスまたは2つwithGMTまたはUTCからのオフセット:GMTとUTCは同義語であると考えていますが、厳密にはそうではありません。
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
System.out.println("Time now in UTC (GMT) is " + now);
このスニペットを実行したとき、出力は次のとおりでした。
UTC(GMT)での現在の時刻は2019-06-17T11:51:38.246188Zです
出力の末尾のZ
はUTCを意味します。
Java 8の後、以下のようにフォーマットされた時間を取得することができます。
DateTimeFormatter.ofPattern("HH:mm:ss.SSS").format(LocalTime.now(ZoneId.of("GMT")));
これは非常にシンプルで簡単です。
Date date = new Date();
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
date = cal.getTime();
現在、日付には現在のGMT時間が含まれます。
GMTでの時間をDST節約で管理するための、以下のような便利なUtilsメソッド:
public static Date convertToGmt(Date date) {
TimeZone tz = TimeZone.getDefault();
Date ret = new Date(date.getTime() - tz.getRawOffset());
// if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY.
if (tz.inDaylightTime(ret)) {
Date dstDate = new Date(ret.getTime() - tz.getDSTSavings());
// check to make sure we have not crossed back into standard time
// this happens when we are on the cusp of DST (7pm the day before the change for PDT)
if (tz.inDaylightTime(dstDate)) {
ret = dstDate;
}
}
return ret;
}
public static Date convertFromGmt(Date date) {
TimeZone tz = TimeZone.getDefault();
Date ret = new Date(date.getTime() + tz.getRawOffset());
// if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY.
if (tz.inDaylightTime(ret)) {
Date dstDate = new Date(ret.getTime() + tz.getDSTSavings());
// check to make sure we have not crossed back into standard time
// this happens when we are on the cusp of DST (7pm the day before the change for PDT)
if (tz.inDaylightTime(dstDate)) {
ret = dstDate;
}
}
return ret;
}