LocalDateTimeをUTCのLocalDateTimeに変換します。
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
ネットで検索しました。しかし、解決策は得られなかった
さらに簡単な方法があります
LocalDateTime.now(Clock.systemUTC())
私は個人的に好む
LocalDateTime.now(ZoneOffset.UTC);
最も読みやすいオプションです。
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());
以下を使用してください。ローカルの日時を取得し、タイムゾーンを使用して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();
}
ローカルの日付時刻を現在のゾーンから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());
}
}
tldr:それを行う方法はありません。それをしようとすると、LocalDateTimeが間違ってしまいます。
その理由は、インスタンスの作成後、LocalDateTimeがタイムゾーンを記録しないためです。特定のタイムゾーンに基づいて、タイムゾーンのない日付時刻を別の日付時刻に変換することはできません。
実際のところ、LocalDateTime.now()は、目的がランダムな結果を得る場合を除いて、運用コードで呼び出されるべきではありません。そのようなLocalDateTimeインスタンスを構築すると、このインスタンスには現在のサーバーのタイムゾーンに基づく日付時刻のみが含まれます。つまり、このコードは異なる結果を生成します別のタイムゾーン設定でサーバーを実行している場合。
LocalDateTimeは、日付の計算を簡素化できます。実際に普遍的に使用可能なデータ時刻が必要な場合は、ZonedDateTimeまたはOffsetDateTimeを使用します。 https://docs.Oracle.com/javase/8/docs/api/Java/time/OffsetDateTime.html 。
回答と質問を見ると、質問は大幅に変更されているようです。現在の質問に答えるには:
LocalDateTimeをUTCのLocalDateTimeに変換します。
LocalDateTime
name__はタイムゾーンに関する情報を保存せず、基本的には年、月、日、時間、分、秒、およびそれより小さい単位の値を保持します。重要な質問は次のとおりです。元のLocalDateTime
name__のタイムゾーンは何ですか?すでにUTCである可能性があるため、変換を行う必要はありません。
とにかく質問をしたことを考えると、おそらく元の時刻がシステムのデフォルトのタイムゾーンにあり、UTCに変換することを意味します。通常、LocalDateTime
name__オブジェクトは、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
name__オブジェクトから抽出できないため、UTCに変換するには、どのタイムゾーンから来ているかを自分で知る必要があります。