LocalDateTimeをUTCでLocalDateTimeに変換します。
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
ネットで検索しました。しかし、解決策は得られませんでした
LocalDateTimeをUTCでLocalDateTimeに変換します。
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
ネットで検索しました。しかし、解決策は得られませんでした
回答:
私は個人的に好きです
LocalDateTime.now(ZoneOffset.UTC);
それが最も読みやすいオプションであるため。
さらに簡単な方法があります
LocalDateTime.now(Clock.systemUTC())
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());
ldt.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"))
簡潔でありながら、ゾーン化されたインスタンス変数を必要としないのに十分な意味を伝えます。
ZoneOffset.UTC
の優れた代替品ですZoneId.of("UTC")
OffsetDateTime
はよりも適切ですZonedDateTime
。使用:OffsetDateTime.now( ZoneOffset.UTC )
またはmyInstant.atOffset( ZoneOffset.UTC )
以下を使用してください。ローカルの日時を取得し、タイムゾーンを使用して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();
}
これは、ローカル日時をゾーンからゾーンに変換するために使用できる簡単な小さなユーティリティクラスです。これには、ローカル日時を現在のゾーンから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());
}
}
回答と質問を見ると、質問が大幅に変更されているようです。したがって、現在の質問に答えるには:
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に変換するには、オブジェクトがどのタイムゾーンから来ているかを自分で知る必要があります。
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.
tldr:それを行う方法はありません。それを行おうとすると、LocalDateTimeが間違ってしまいます。
その理由は、LocalDateTimeインスタンスが作成された後がタイムゾーンを記録しない。タイムゾーンのない日時を、特定のタイムゾーンに基づいて別の日時に変換することはできません。
実際のところ、目的がランダムな結果を取得することでない限り、LocalDateTime.now()を本番コードで呼び出さないでください。このようなLocalDateTimeインスタンスを作成すると、このインスタンスには現在のサーバーのタイムゾーンに基づいた日時のみが含まれます。つまり、このコードは、異なるタイムゾーン構成でサーバーを実行している場合に異なる結果を生成します。
LocalDateTimeは、日付の計算を簡素化できます。普遍的に使用できる実際のデータ時間を必要とする場合は、ZonedDateTimeまたはOffsetDateTimeを使用します:https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html 。
この方法を使用してこれを試してください。
あなたの変換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();
}
あなたはそのようなことをするヘルパーを実装することができます:
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();
}
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); }
SimpleDateFormat
クラスを使うように若い人たちに教えないでください。少なくとも最初の選択肢としてではありません。そして、予約なしではありません。今日でjava.time
は、最新のJava日付と時刻APIとそのがはるかに優れていますDateTimeFormatter
。