Haben Sie das Javadoc für LocalDateTime gefunden? Es heißt: "Diese Klasse speichert oder repräsentiert keine Zeitzone. Stattdessen ist es eine Beschreibung des Datums, wie es für Geburtstage verwendet wird, kombiniert mit der Ortszeit, wie sie auf einer Wanduhr angezeigt wird. Sie kann keinen Moment auf der Uhr darstellen." Zeitleiste ohne zusätzliche Informationen wie Versatz oder Zeitzone. "
Aro_tech
1
Ihre Frage macht keinen Sinn - Sie sollten den Kontext dieser Methode und das, was Sie erreichen möchten, erläutern. Es scheint, dass Sie ein grundlegendes Missverständnis darüber haben, was die verschiedenen Klassen der API darstellen.
Assylias
3
Wenn Sie sich für Zeitzonen interessieren, müssen Sie ZonedDateTime verwenden, das Konvertierungsmethoden zwischen Zeitzonen mit ZoneSameLocal () und withZoneSameInstant ()
Dies ist korrekt, jedoch nicht technisch verpackt. 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.
Brett Ryan
19
ZoneOffset.UTCist ein schöner Ersatz fürZoneId.of("UTC")
ycomp
2
Für UTC ist das OffsetDateTimebesser geeignet als ZonedDateTime. Verwenden Sie: OffsetDateTime.now( ZoneOffset.UTC )odermyInstant.atOffset( ZoneOffset.UTC )
Basil Bourque
15
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.
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.
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;
publicfinalclassDateTimeUtil{
privateDateTimeUtil(){
super();
}
publicstaticvoidmain(final String... args){
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime utc = DateTimeUtil.toUtc(now);
System.out.println("Now: " + now);
System.out.println("UTC: " + utc);
}
publicstatic 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();
}
publicstatic LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone){
return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone);
}
publicstatic LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone){
return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC);
}
publicstatic LocalDateTime toUtc(final LocalDateTime time){
return DateTimeUtil.toUtc(time, ZoneId.systemDefault());
}
}
Fügen Sie außerdem Folgendes hinzu: final LocalDateTime backToLocal = DateTimeUtil.toZone (utc, ZoneOffset.UTC, ZoneId.systemDefault ()); System.out.println ("Zurück zu lokal:" + backToLocal);
rjdkolb
7
Frage?
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.
Zeitzone?
LocalDateTimespeichert 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.
Systemstandard-Zeitzone
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 LocalDateTimeObjekt 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:
2019-02-2511:39// [time] original LocalDateTime without a timezone2019-02-2511:39 GMT+1// [atZone] converted to ZonedDateTime (system timezone is Madrid)2019-02-2510:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime2019-02-2510:39// [toLocalDateTime] losing the timezone information
Explizite Zeitzone
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-2511:39// [time] original LocalDateTime without a timezone2019-02-2511:39 GMT+2// [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)2019-02-2509:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime2019-02-2509:39// [toLocalDateTime] losing the timezone information
Die atZone()Methode
Das 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-2511:39// [time] original LocalDateTime without a timezone2018-08-2511:39 GMT+3// [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)2018-08-2508:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime2018-08-2508: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-2803:30 GMT+3// summer time [UTC 2018-10-28 00:30]2018-10-2804:00 GMT+3// clocks are turned back 1 hour [UTC 2018-10-28 01:00]2018-10-2803:00 GMT+2// same as above [UTC 2018-10-28 01:00]2018-10-2803: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:30für die Zeitzone Europe/Tallinnzwei verschiedene UTC-Zeiten und zwei verschiedene Offsets bedeuten.
Zusammenfassung
Wie Sie sehen können, hängt das Endergebnis von der Zeitzone der als Argument verstrichenen Zeit ab. Da die Zeitzone nicht aus dem LocalDateTimeObjekt extrahiert werden kann, müssen Sie selbst wissen, aus welcher Zeitzone sie stammt, um sie in UTC zu konvertieren.
Vielen Dank für die Informationen über LocalDateTime speichert keine Informationen über die Zeitzone! 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: 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 zeichnet keine Zeitzone auf. Möglicherweise verfügen Sie jedoch über dieses Wissen von einer anderen Stelle und fügen diese Informationen vor der Konvertierung Ihren LocalDateTimes hinzu.
Tristan
0
Versuchen Sie dies mit dieser Methode.
Konvertieren Sie Ihre LocalDateTimein ZonedDateTimemit der Methode of und übergeben Sie die Standardzeitzone des Systems, oder verwenden Sie die ZoneId Ihrer Zone wieZoneId.of("Australia/Sydney");
Bitte bringen Sie den Jungen nicht bei, die lange veraltete und notorisch problematische SimpleDateFormatKlasse zu benutzen . Zumindest nicht als erste Option. Und das nicht ohne Vorbehalt. Heute haben wir java.timedie moderne Java-API für Datum und Uhrzeit und ihre DateTimeFormatter.
Antworten:
Ich persönlich bevorzuge
da es die am besten lesbare Option ist.
quelle
Es gibt einen noch einfacheren Weg
quelle
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());
quelle
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 alsZonedDateTime
. 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.
Wenn Sie den LocalDateTime-Teil von ZonedDateTime abrufen müssen, können Sie Folgendes verwenden.
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(); }
quelle
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()); } }
quelle
Frage?
Wenn man sich die Antworten und die Frage ansieht, scheint die Frage erheblich geändert worden zu sein. Um die aktuelle Frage zu beantworten:
Zeitzone?
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 OriginalsLocalDateTime
? Es könnte genauso gut schon UTC sein, daher muss keine Konvertierung vorgenommen werden.Systemstandard-Zeitzone
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, mitLocalDateTime.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
Explizite Zeitzone
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
Die
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 ZeitzoneEurope/Tallinn
zwei verschiedene UTC-Zeiten und zwei verschiedene Offsets bedeuten.Zusammenfassung
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.quelle
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 .
quelle
Versuchen Sie dies mit dieser Methode.
Konvertieren Sie Ihre
LocalDateTime
inZonedDateTime
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(); }
quelle
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(); }
quelle
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); }}
quelle
SimpleDateFormat
Klasse zu benutzen . Zumindest nicht als erste Option. Und das nicht ohne Vorbehalt. Heute haben wirjava.time
die moderne Java-API für Datum und Uhrzeit und ihreDateTimeFormatter
.