Konvertieren Sie LocalDateTime in LocalDateTime in UTC.
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
Ich habe über das Netz gesucht. Habe aber keine Lösung bekommen
Konvertieren Sie LocalDateTime in LocalDateTime in UTC.
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
Ich habe über das Netz gesucht. Habe aber keine Lösung bekommen
Antworten:
Ich persönlich bevorzuge
LocalDateTime.now(ZoneOffset.UTC);
da es die am besten lesbare Option ist.
Es gibt einen noch einfacheren Weg
LocalDateTime.now(Clock.systemUTC())
LocalDateTime enthält keine Zoneninformationen. ZonedDatetime tut es.
Wenn Sie LocalDateTime in UTC konvertieren möchten, müssen Sie mit der Faust von ZonedDateTime umbrechen.
Sie können wie folgt konvertieren.
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"))
während prägnant immer noch Bedeutung genug vermittelt, um die zonierte Instanzvariable nicht zu benötigen.
ZoneOffset.UTC
ist ein schöner Ersatz fürZoneId.of("UTC")
OffsetDateTime
besser geeignet als ZonedDateTime
. Verwenden Sie: OffsetDateTime.now( ZoneOffset.UTC )
odermyInstant.atOffset( ZoneOffset.UTC )
Verwenden Sie die folgenden. Es nimmt die lokale Datums- und Uhrzeitangabe und konvertiert sie mithilfe der Zeitzone in UTC. Sie müssen die Funktion nicht erstellen.
ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());
Wenn Sie den LocalDateTime-Teil von ZonedDateTime abrufen müssen, können Sie Folgendes verwenden.
nowUTC.toLocalDateTime();
Hier ist eine statische Methode, die ich in meiner Anwendung verwende, um die UTC-Zeit in MySQL einzufügen, da ich einer Datetime-Spalte keinen Standardwert UTC_TIMESTAMP hinzufügen kann.
public static LocalDateTime getLocalDateTimeInUTC(){
ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
return nowUTC.toLocalDateTime();
}
Hier ist eine einfache kleine Dienstprogrammklasse, mit der Sie lokale Datumszeiten von Zone zu Zone konvertieren können, einschließlich einer Dienstprogrammmethode, mit der eine lokale Datumszeit direkt von der aktuellen Zone in UTC konvertiert werden kann (mit der Hauptmethode, damit Sie sie ausführen und die Ergebnisse anzeigen können eines einfachen Tests):
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());
}
}
Wenn man sich die Antworten und die Frage ansieht, scheint die Frage erheblich geändert worden zu sein. Um die aktuelle Frage zu beantworten:
Konvertieren Sie LocalDateTime in LocalDateTime in UTC.
LocalDateTime
speichert keine Informationen über die Zeitzone, sondern enthält lediglich die Werte für Jahr, Monat, Tag, Stunde, Minute, Sekunde und kleinere Einheiten. Eine wichtige Frage ist also: Was ist die Zeitzone des Originals LocalDateTime
? Es könnte genauso gut schon UTC sein, daher muss keine Konvertierung vorgenommen werden.
In Anbetracht der Tatsache, dass Sie die Frage trotzdem gestellt haben, haben Sie wahrscheinlich gemeint, dass die ursprüngliche Zeit in Ihrer Systemstandardzeitzone liegt und Sie sie in UTC konvertieren möchten. Denn normalerweise wird ein LocalDateTime
Objekt erstellt, mit LocalDateTime.now()
dem die aktuelle Zeit in der Standardzeitzone des Systems zurückgegeben wird. In diesem Fall wäre die Konvertierung wie folgt:
LocalDateTime convertToUtc(LocalDateTime time) {
return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
Ein Beispiel für den Konvertierungsprozess:
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
In jedem anderen Fall lautet die Konvertierung wie folgt, wenn Sie die Zeitzone der zu konvertierenden Zeit explizit angeben:
LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
Ein Beispiel für den Konvertierungsprozess:
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()
MethodeDas Ergebnis der atZone()
Methode hängt von der als Argument verstrichenen Zeit ab, da alle Regeln der Zeitzone einschließlich der Sommerzeit (DST) berücksichtigt werden. In den Beispielen war die Zeit der 25. Februar, in Europa bedeutet dies Winterzeit (keine Sommerzeit).
Wenn wir ein anderes Datum verwenden würden, sagen wir den 25. August gegenüber dem Vorjahr, wäre das Ergebnis unter Berücksichtigung der Sommerzeit anders:
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
Die GMT-Zeit ändert sich nicht. Daher werden die Offsets in den anderen Zeitzonen angepasst. In diesem Beispiel beträgt die Sommerzeit Estlands GMT + 3 und die Winterzeit GMT + 2.
Wenn Sie eine Zeit innerhalb des Übergangs von Uhrenwechsel um eine Stunde angeben. ZB 28. Oktober 2018, 03:30 Uhr für Estland kann dies zwei verschiedene Zeiten bedeuten:
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]
Ohne manuelle Angabe des Offsets (GMT + 2 oder GMT + 3) kann die Zeit 03:30
für die Zeitzone Europe/Tallinn
zwei verschiedene UTC-Zeiten und zwei verschiedene Offsets bedeuten.
Wie Sie sehen können, hängt das Endergebnis von der Zeitzone der als Argument verstrichenen Zeit ab. Da die Zeitzone nicht aus dem LocalDateTime
Objekt extrahiert werden kann, müssen Sie selbst wissen, aus welcher Zeitzone sie stammt, um sie in UTC zu konvertieren.
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: Es gibt einfach keine Möglichkeit, das zu tun. Wenn Sie dies versuchen, wird LocalDateTime falsch angezeigt .
Der Grund dafür ist, dass LocalDateTime nach dem Erstellen von Instanzen keine Zeitzone aufzeichnet. Sie können eine Datumszeit ohne Zeitzone nicht in eine andere Datumszeit konvertieren, die auf einer bestimmten Zeitzone basiert.
Tatsächlich sollte LocalDateTime.now () niemals im Produktionscode aufgerufen werden, es sei denn, Sie möchten zufällige Ergebnisse erzielen . Wenn Sie eine solche LocalDateTime- Instanz erstellen , enthält diese Instanz NUR die Datums- und Uhrzeitangabe basierend auf der Zeitzone des aktuellen Servers. Dies bedeutet, dass dieser Code ein anderes Ergebnis generiert, wenn ein Server mit einer anderen Zeitzonenkonfiguration ausgeführt wird.
LocalDateTime kann die Datumsberechnung vereinfachen. Wenn Sie eine wirklich universell nutzbare Datenzeit wünschen, verwenden Sie ZonedDateTime oder OffsetDateTime: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html .
Versuchen Sie dies mit dieser Methode.
Konvertieren Sie Ihre LocalDateTime
in ZonedDateTime
mit der Methode of und übergeben Sie die Standardzeitzone des Systems, oder verwenden Sie die ZoneId Ihrer Zone wieZoneId.of("Australia/Sydney");
LocalDateTime convertToUtc(LocalDateTime dateTime) {
ZonedDateTime dateTimeInMyZone = ZonedDateTime.
of(dateTime, ZoneId.systemDefault());
return dateTimeInMyZone
.withZoneSameInstant(ZoneOffset.UTC)
.toLocalDateTime();
}
Verwenden Sie Folgendes, um das lokale Datum und die Uhrzeit Ihrer Zone wiederherzustellen.
LocalDateTime convertFromUtc(LocalDateTime utcDateTime){
return ZonedDateTime.
of(utcDateTime, ZoneId.of("UTC"))
.toOffsetDateTime()
.atZoneSameInstant(ZoneId.systemDefault())
.toLocalDateTime();
}
Sie können einen Helfer implementieren, der so etwas tut:
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
Klasse zu benutzen . Zumindest nicht als erste Option. Und das nicht ohne Vorbehalt. Heute haben wir java.time
die moderne Java-API für Datum und Uhrzeit und ihre DateTimeFormatter
.