web-dev-qa-db-ja.com

GMT時間をJavaで取得

Javaでは、GMTで現在の時刻を取得します。

私はこのようなさまざまなオプションを試しました:

Date date = new Date();
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date1 = calendar.getTime();

しかし、日付は常に私のローカルタイムゾーンで解釈されます。

何が間違っているのですか?Java DateをGMTに変換するにはどうすればよいですか?

26
narayanan

日付を取得する際にバックエンドで正しいことを行ったのは良いことですが、その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のタイムゾーンをロケールのタイムゾーンに設定する代わりに、希望するものに設定できます。

34
Edwin Buck

なぜ誰もこれをしないのだろうか:

Calendar time = Calendar.getInstance();
time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));
Date date = time.getTime();

更新:Java 8,9,10以降、Javaでサポートされているより良い代替手段があるはずです。コメントありがとうございます@humanity

19
Harun

私の経験から、JavaのバンドルされたCalendarおよびDateクラスは、望ましくない効果をもたらす可能性があります。Java 8へのアップグレードを気にしないなら、ZonedDateTime

そのようです:

ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC );
7
Damilola

tl; dr

Instant.now()

Java.time

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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacyJava.util.DateCalendar 、& SimpleDateFormat

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

詳細については、 Oracleチュートリアル を参照してください。多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 310 です。

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

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

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

5
Basil Bourque

GMTでミリ秒単位の時間を取得するために必要なのは

long millis = System.currentTimeMillis();

あなたもできる

long millis = new Date().getTime();

そして

long millis = 
    Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();

しかし、これらは同じ呼び出しを行う非効率的な方法です。

2
Peter Lawrey

多くの方法を試した後、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();

これは正常に機能します。 :)

2
Firdous Ahmad

できません

最初に、不可能を求めています。昔ながらのDateオブジェクトは、タイムゾーンまたはGMTオフセットを持つことができないため、取得していません。

しかし、日付は常に私のローカルタイムゾーンで解釈されます。

Dateを出力したか、暗黙的にtoStringメソッドを呼び出す何かを実行したと思います。 Dateがタイムゾーンで解釈されるのはこれが唯一の時間だと思います。より正確には、JVMの現在のデフォルトのタイムゾーンで。一方、これは避けられません。 Date.toString()doesはそのように動作し、JVMのタイムゾーン設定を取得し、返される文字列のレンダリングに使用します。

Java.timeでできます

ただし、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を意味します。

リンク集

1
Ole V.V.

Java 8の後、以下のようにフォーマットされた時間を取得することができます。

DateTimeFormatter.ofPattern("HH:mm:ss.SSS").format(LocalTime.now(ZoneId.of("GMT")));
0
Denis Wang

これは非常にシンプルで簡単です。

Date date = new Date();
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
date = cal.getTime();

現在、日付には現在のGMT時間が含まれます。

0
HeisenBerg

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;
}
0
Kalpesh