LocalDateTimeをUTCでLocalDateTimeに変換する


86

LocalDateTimeをUTCでLocalDateTimeに変換します。

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}

ネットで検索しました。しかし、解決策は得られませんでした


4
LocalDateTimeのjavadocを見つけましたか?「このクラスはタイムゾーンを保存または表しません。代わりに、誕生日に使用される日付の説明と、掛け時計に表示される現地時間の組み合わせです。の瞬間を表すことはできません。オフセットやタイムゾーンなどの追加情報のないタイムライン。」
aro_tech 2016年

1
あなたの質問は意味がありません-あなたはこの方法の文脈とあなたが達成しようとしていることを説明するべきです。APIのさまざまなクラスが何を表しているのかについて根本的な誤解があるようです。
assylias 2016年

3
タイムゾーンが気になる場合は、ZoneSameLocal()とwithZoneSameInstant()のタイムゾーン間の変換メソッドがあるZonedDateTimeを使用する必要があります
JodaStephen 2016年

Y A。わかりました。ありがとう
Sarika.S 2016年

回答:


105

私は個人的に好きです

LocalDateTime.now(ZoneOffset.UTC);

それが最も読みやすいオプションであるため。


26
これは(今)新しい時間を作りませんか?元の質問は、UTCに知られている時間の変換についてだった
Evvo

LocalDateTimeからUTC
Ashok kumarGanesan20年


64

LocalDateTimeにはゾーン情報が含まれていません。ZonedDatetimeはそうします。

LocalDateTimeをUTCに変換する場合は、ZonedDateTime拳でラップする必要があります。

以下のように変換できます。

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.toLocalTime());

ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault());

ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC"));

System.out.println(utcZoned.toLocalTime());

2
技術的にはラップされていませんが、これは正しいです。ldt.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"))簡潔でありながら、ゾーン化されたインスタンス変数を必要としないのに十分な意味を伝えます。
ブレットライアン

22
ZoneOffset.UTCの優れた代替品ですZoneI‌​d.of("UTC")
ycomp 2017

2
UTCの場合、OffsetDateTimeはよりも適切ですZonedDateTime。使用:OffsetDateTime.now( ZoneOffset.UTC )またはmyInstant.atOffset( ZoneOffset.UTC )
バジルバーク2017

15

以下を使用してください。ローカルの日時を取得し、タイムゾーンを使用してUTCに変換します。関数を作成する必要はありません。

ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());

ZonedDateTimeのLocalDateTime部分を取得する必要がある場合は、以下を使用できます。

nowUTC.toLocalDateTime();

これは、デフォルト値のUTC_TIMESTAMPをdatetime列に追加できないため、アプリケーションでmysqlにUTC時間を挿入するために使用する静的メソッドです。

public static LocalDateTime getLocalDateTimeInUTC(){
    ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);

    return nowUTC.toLocalDateTime();
}

14

これは、ローカル日時をゾーンからゾーンに変換するために使用できる簡単な小さなユーティリティクラスです。これには、ローカル日時を現在のゾーンからUTCに直接変換するユーティリティメソッドが含まれます(mainメソッドを使用して実行し、結果を確認できます)。簡単なテストの):

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public final class DateTimeUtil {
    private DateTimeUtil() {
        super();
    }

    public static void main(final String... args) {
        final LocalDateTime now = LocalDateTime.now();
        final LocalDateTime utc = DateTimeUtil.toUtc(now);

        System.out.println("Now: " + now);
        System.out.println("UTC: " + utc);
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId fromZone, final ZoneId toZone) {
        final ZonedDateTime zonedtime = time.atZone(fromZone);
        final ZonedDateTime converted = zonedtime.withZoneSameInstant(toZone);
        return converted.toLocalDateTime();
    }

    public static LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone) {
        return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone);
    }

    public static LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone) {
        return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC);
    }

    public static LocalDateTime toUtc(final LocalDateTime time) {
        return DateTimeUtil.toUtc(time, ZoneId.systemDefault());
    }
}

また、次を追加します。finalLocalDateTime backToLocal = DateTimeUtil.toZone(utc、ZoneOffset.UTC、ZoneId.systemDefault()); System.out.println( "ローカルに戻る:" + backToLocal);
rjdkolb 2018

9

質問?

回答と質問を見ると、質問が大幅に変更されているようです。したがって、現在の質問に答えるには:

LocalDateTimeをUTCでLocalDateTimeに変換します。

タイムゾーン?

LocalDateTimeタイムゾーンに関する情報は格納されません。基本的に、年、月、日、時、分、秒、およびそれよりも小さい単位の値が保持されます。したがって、重要な質問は次のとおりです。オリジナルのタイムゾーンは何LocalDateTimeですか?すでにUTCである可能性もあるため、変換を行う必要はありません。

システムのデフォルトのタイムゾーン

とにかく質問したことを考えると、おそらく元の時刻がシステムのデフォルトのタイムゾーンにあり、UTCに変換したいということです。通常、LocalDateTimeオブジェクトはLocalDateTime.now()、システムのデフォルトのタイムゾーンで現在の時刻を返すを使用して作成されるためです。この場合、変換は次のようになります。

LocalDateTime convertToUtc(LocalDateTime time) {
    return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

変換プロセスの例:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+1 // [atZone] converted to ZonedDateTime (system timezone is Madrid)
2019-02-25 10:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 10:39 // [toLocalDateTime] losing the timezone information

明示的なタイムゾーン

それ以外の場合、変換する時間のタイムゾーンを明示的に指定すると、変換は次のようになります。

LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
    return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

変換プロセスの例:

2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+2 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2019-02-25 09:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 09:39 // [toLocalDateTime] losing the timezone information

atZone()メソッド

このatZone()メソッドの結果は、夏時間(DST)を含むタイムゾーンのすべてのルールを考慮するため、引数として渡された時間に依存します。例では、時刻は2月25日でした。ヨーロッパでは、これは冬時間(DSTなし)を意味します。

昨年とは異なる日付、たとえば8月25日を使用する場合、DSTを考慮すると、結果は異なります。

2018-08-25 11:39 // [time] original LocalDateTime without a timezone
2018-08-25 11:39 GMT+3 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2018-08-25 08:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2018-08-25 08:39 // [toLocalDateTime] losing the timezone information

GMT時刻は変更されません。したがって、他のタイムゾーンのオフセットが調整されます。この例では、エストニアの夏時間はGMT + 3で、冬時間はGMT +2です。

また、時計を1時間戻すトランジション内の時間を指定した場合。たとえば、エストニアの2018年10月28日03:30の場合、これは2つの異なる時間を意味する可能性があります。

2018-10-28 03:30 GMT+3 // summer time [UTC 2018-10-28 00:30]
2018-10-28 04:00 GMT+3 // clocks are turned back 1 hour [UTC 2018-10-28 01:00]
2018-10-28 03:00 GMT+2 // same as above [UTC 2018-10-28 01:00]
2018-10-28 03:30 GMT+2 // winter time [UTC 2018-10-28 01:30]

オフセットを手動で指定しない場合(GMT +2またはGMT + 3)、03:30タイムゾーンの時間Europe/Tallinnは2つの異なるUTC時間と2つの異なるオフセットを意味する可能性があります。

概要

ご覧のとおり、最終結果は引数として渡された時間のタイムゾーンによって異なります。LocalDateTimeオブジェクトからタイムゾーンを抽出できないため、UTCに変換するには、オブジェクトがどのタイムゾーンから来ているかを自分で知る必要があります。


1
LocalDateTimeに関する情報をありがとう、タイムゾーンに関する情報は保存されません。LocalDateTime does not store any information about the time-zone, it just basically holds the values of year, month, day, hour, minute, second, and smaller units.
LiuWenbin_NO。

5

tldr:それを行う方法はありません。それを行おうとすると、LocalDateTimeが間違ってしまいます。

その理由は、LocalDateTimeインスタンスが作成された後がタイムゾーンを記録しない。タイムゾーンのない日時を、特定のタイムゾーンに基づいて別の日時に変換することはできません。

実際のところ、目的がランダムな結果を取得することでない限り、LocalDateTime.now()を本番コードで呼び出さないでください。このようなLocalDateTimeインスタンスを作成すると、このインスタンスには現在のサーバーのタイムゾーンに基づいた日時のみが含まれます。つまり、このコードは、異なるタイムゾーン構成でサーバーを実行している場合に異なる結果を生成します。

LocalDateTimeは、日付の計算を簡素化できます。普遍的に使用できる実際のデータ時間を必要とする場合は、ZonedDateTimeまたはOffsetDateTimeを使用します:https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html 。


LocalDateTimeはタイムゾーンを記録しませんが、他の場所からこの知識を持っていて、変換前にこの情報をLocalDateTimesに追加することができます。
トリスタン

1

この方法を使用してこれを試してください。

あなたの変換LocalDateTimeには、ZonedDateTime使用して方法をして、システムのデフォルトのタイムゾーンを渡すか、使用することができますするzoneidを同様にあなたのゾーンのZoneId.of("Australia/Sydney");

LocalDateTime convertToUtc(LocalDateTime dateTime) {
  ZonedDateTime dateTimeInMyZone = ZonedDateTime.
                                        of(dateTime, ZoneId.systemDefault());

  return dateTimeInMyZone
                  .withZoneSameInstant(ZoneOffset.UTC)
                  .toLocalDateTime();
  
}

ゾーンの現地日時に戻すには、次を使用します。

LocalDateTime convertFromUtc(LocalDateTime utcDateTime){
    return ZonedDateTime.
            of(utcDateTime, ZoneId.of("UTC"))
            .toOffsetDateTime()
            .atZoneSameInstant(ZoneId.systemDefault())
            .toLocalDateTime();
}

-1

あなたはそのようなことをするヘルパーを実装することができます:

public static LocalDateTime convertUTCFRtoUTCZ(LocalDateTime dateTime) {
    ZoneId fr = ZoneId.of("Europe/Paris");
    ZoneId utcZ = ZoneId.of("Z");
    ZonedDateTime frZonedTime = ZonedDateTime.of(dateTime, fr);
    ZonedDateTime utcZonedTime = frZonedTime.withZoneSameInstant(utcZ);
    return utcZonedTime.toLocalDateTime();
}

UTCfrからUTCZ?何の意味もありません。UTC = Z、UTC <> fr
トリスタン

-2
public static String convertFromGmtToLocal(String gmtDtStr, String dtFormat, TimeZone lclTimeZone) throws Exception{
        if (gmtDtStr == null || gmtDtStr.trim().equals("")) return null;
        SimpleDateFormat format = new SimpleDateFormat(dtFormat);
        format.setTimeZone(getGMTTimeZone());
        Date dt = format.parse(gmtDtStr);
        format.setTimeZone(lclTimeZone);
        return

format.format(dt); }


1
古くて悪名高い面倒なSimpleDateFormatクラスを使うように若い人たちに教えないでください。少なくとも最初の選択肢としてではありません。そして、予約なしではありません。今日でjava.timeは、最新のJava日付と時刻APIとそのがはるかに優れていますDateTimeFormatter
OleVV19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.