Konvertieren Sie LocalDateTime in LocalDateTime in UTC


82

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


4
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 ()
JodaStephen

Ja. Ich habe verstanden. Danke
Sarika.S

Antworten:


103

Ich persönlich bevorzuge

LocalDateTime.now(ZoneOffset.UTC);

da es die am besten lesbare Option ist.


19
Schafft dies nicht eine neue Zeit (jetzt)? Die ursprüngliche Frage
betraf die

73

Es gibt einen noch einfacheren Weg

LocalDateTime.now(Clock.systemUTC())

21
Schön, beantwortet aber nicht die ursprüngliche Frage.
Eirirlar

2
Diese Antwort konvertiert ein UTC-Datum in ein lokales Datum. Die ursprüngliche Frage war, wie ein LocalDate in ein UTC-Datum konvertiert werden kann.
Cypress Frankenfeld

57

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());

2
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ürZoneI‌​d.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.

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

14

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

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:

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()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-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: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.


1
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 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 .


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");

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

-1

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

UTC fr bis UTC Z? bedeutet nichts. UTC = Z, UTC <> fr
Tristan

-2
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); }}


1
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.
Ole VV
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.