web-dev-qa-db-fra.com

Conversion de LocalDateTime en LocalDateTime au format UTC

Convertissez LocalDateTime en LocalDateTime au format UTC.

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}

J'ai cherché sur le net. Mais n'a pas trouvé de solution

52
1355

Il y a un moyen encore plus simple

LocalDateTime.now(Clock.systemUTC())
73
Leon Radley

Personnellement, je préfère

LocalDateTime.now(ZoneOffset.UTC);

comme c'est l'option la plus lisible.

65
slorinc

LocalDateTime ne contient pas d'informations de zone. ZonedDatetime fait.

Si vous souhaitez convertir LocalDateTime en UTC, vous devez envelopper par le poing ZonedDateTime.

Vous pouvez convertir comme ci-dessous.

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());
36
Fatih Arslan

Utilisez le ci-dessous. Il prend l'heure locale et le convertit en UTC à l'aide du fuseau horaire. Vous n'avez pas besoin de créer cette fonction.

ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());

Si vous devez obtenir la partie LocalDateTime de ZonedDateTime, vous pouvez utiliser ce qui suit.

nowUTC.toLocalDateTime();

Voici une méthode statique que j’utilise dans mon application pour insérer l’heure UTC dans mysql car je ne peux pas ajouter de valeur par défaut TC_TIMESTAMP à une colonne datetime.

public static LocalDateTime getLocalDateTimeInUTC(){
    ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);

    return nowUTC.toLocalDateTime();
}
12
patelb

Voici une petite classe d’utilitaires simple que vous pouvez utiliser pour convertir des heures de date locales d’une zone à l’autre, y compris une méthode utilitaire permettant de convertir une heure de date locale de la zone en cours au format UTC (avec la méthode main afin que vous puissiez l’exécuter et voir les résultats) d'un test simple):

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

Question?

En regardant les réponses et la question, il semble que la question a été modifiée de manière significative. Donc, pour répondre à la question actuelle:

Convertissez LocalDateTime en LocalDateTime au format UTC.

Fuseau horaire?

LocalDateTime ne stocke aucune information sur le fuseau horaire, il contient essentiellement les valeurs d'année, de mois, de jour, d'heure, de minute, de seconde et d'unités plus petites. Par conséquent, une question importante est la suivante: Quel est le fuseau horaire de la LocalDateTime originale?? Il pourrait aussi bien s'agir de l'heure UTC, aucune conversion n'est donc nécessaire.

Fuseau horaire par défaut du système

Étant donné que vous avez quand même posé la question, vous vouliez probablement dire que l'heure d'origine est dans votre fuseau horaire système par défaut et que vous souhaitez le convertir au format UTC. Parce que généralement un objet LocalDateTime est créé à l'aide de LocalDateTime.now() qui renvoie l'heure actuelle dans le fuseau horaire par défaut du système. Dans ce cas, la conversion serait la suivante:

LocalDateTime convertToUtc(LocalDateTime time) {
    return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

Un exemple du processus de conversion:

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

Fuseau horaire explicite

Dans tous les autres cas, lorsque vous spécifiez explicitement le fuseau horaire de l'heure à convertir, la conversion serait la suivante:

LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
    return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}

Un exemple du processus de conversion:

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

La méthode atZone()

Le résultat de la méthode atZone() dépend de l'heure passée en argument, car elle prend en compte toutes les règles du fuseau horaire, y compris l'heure d'été (DST). Dans les exemples, l'heure était le 25 février; en Europe, cela signifie l'heure d'hiver (pas d'heure d'été).

Si nous utilisions une date différente, par exemple le 25 août de l'année dernière, le résultat serait différent, compte tenu de l'heure d'été:

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

L’heure GMT ne change pas. Par conséquent, les décalages dans les autres fuseaux horaires sont ajustés. Dans cet exemple, l'heure d'été de l'Estonie est GMT + 3 et l'heure d'hiver GMT + 2.

De même, si vous spécifiez une heure dans la transition, il est nécessaire de changer d’horloge d’une heure en arrière. Par exemple. 28 octobre 2018 03h30 pour l'Estonie, cela peut signifier deux moments différents:

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]

Sans spécifier manuellement le décalage (GMT + 2 ou GMT + 3), l'heure 03:30 du fuseau horaire Europe/Tallinn peut signifier deux heures UTC différentes et deux décalages différents.

Sommaire

Comme vous pouvez le constater, le résultat final dépend du fuseau horaire du temps passé en argument. Le fuseau horaire ne pouvant pas être extrait de l'objet LocalDateTime, vous devez savoir vous-même de quel fuseau horaire il provient afin de le convertir en UTC.

2
anddero

tldr: il n'y a tout simplement aucun moyen de le faire; si vous essayez de faire cela, vous obtenez LocalDateTime faux.

La raison en est que LocalDateTime n'enregistre pas le fuseau horaire après la création d'instances. Vous ne pouvez pas convertir une date heure sans fuseau horaire en une autre heure sur la base d'un fuseau horaire spécifique.

En fait, LocalDateTime.now () ne doit jamais être appelé dans le code de production, à moins que votre objectif ne soit d'obtenir des résultats aléatoires. Lorsque vous construisez une instance LocalDateTime comme celle-ci, cette instance contient la date et l'heure UNIQUEMENT en fonction du fuseau horaire du serveur actuel, ce qui signifie que cette partie de code générera un résultat différent. s'il exécute un serveur avec une configuration de fuseau horaire différente.

LocalDateTime peut simplifier le calcul de la date. Si vous souhaitez que les données soient réellement utilisables universellement, utilisez ZonedDateTime ou OffsetDateTime: https://docs.Oracle.com/javase/8/docs/api/Java/time/OffsetDateTime.html .

2
Andrew Feng