web-dev-qa-db-ja.com

LocalDateTimeをUTCのLocalDateTimeに変換する

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

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}

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

50
1355

さらに簡単な方法があります

LocalDateTime.now(Clock.systemUTC())
72
Leon Radley

私は個人的に好む

LocalDateTime.now(ZoneOffset.UTC);

最も読みやすいオプションです。

54
slorinc

LocalDateTimeにはゾーン情報は含まれません。 ZonedDatetimeはそうです。

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

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

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());
36
Fatih Arslan

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

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

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

nowUTC.toLocalDateTime();

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

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

    return nowUTC.toLocalDateTime();
}
11
patelb

ローカルの日付時刻を現在のゾーンからUTCに直接変換するユーティリティメソッドを含む、ローカルの日付時刻をゾーンからゾーンに変換するために使用できるシンプルな小さなユーティリティクラスを次に示します(メインメソッドを使用すると、実行して結果を確認できます)簡単なテストの):

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());
    }
}
9
ManoDestra

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

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

実際のところ、LocalDateTime.now()は、目的がランダムな結果を得る場合を除いて、運用コードで呼び出されるべきではありません。そのようなLocalDateTimeインスタンスを構築すると、このインスタンスには現在のサーバーのタイムゾーンに基づく日付時刻のみが含まれます。つまり、このコードは異なる結果を生成します別のタイムゾーン設定でサーバーを実行している場合。

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

2
Andrew Feng

質問?

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

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

タイムゾーン?

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

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

とにかく質問をしたことを考えると、おそらく元の時刻がシステムのデフォルトのタイムゾーンにあり、UTCに変換することを意味します。通常、LocalDateTimename__オブジェクトは、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つの異なるオフセットを意味する場合があります。

概要

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

1
anddero