LocalDateTime et ZonedDateTime

1.DateHeureLocale

LocalDateTime est une nouvelle représentation temporelle introduite dans Java8. Oui, vous avez bien lu, il l'envoie tout seul, j'utilise Java8.
LocalDateTime, la traduction littérale est la date et l'heure locales. Puisqu'il s'agit de la date et de l'heure locales, elle n'inclut pas la notion de fuseau horaire.

Une date-heure sans fuseau horaire dans le système de calendrier ISO-8601, tel que 2007-12-03T10:15:30.
Cette classe ne stocke ni ne représente de fuseau horaire. Il s'agit plutôt d'une description de la date, telle qu'elle est utilisée pour les anniversaires, combinée à l'heure locale telle qu'elle apparaît sur une horloge murale. Il ne peut pas représenter un instant sur la chronologie sans informations supplémentaires telles qu'un décalage ou un fuseau horaire.

Dans le système de calendrier standard ISO-8601, la date et l'heure n'ont pas de fuseau horaire, tout comme 2007-12-03T10:15:30.
Cette classe ne stocke ni ne représente les fuseaux horaires. Il s'agit plutôt d'une description de la date, utilisée pour les anniversaires, combinée à l'heure locale sur l'horloge murale. Sans informations supplémentaires telles que le décalage ou le fuseau horaire, il ne peut pas représenter un instant sur la timeline.

LocalDateTime se compose de deux parties : LocalDate et LocalTime

1.1 Date locale

Obtenez la date actuelle

fun main() {
    
    
    var now = LocalDate.now()
    println(now.toString())
}

Le résultat est :

2022-02-02

Ce qui est représenté ici est la date actuelle, le 2 février 2022, mais cela ne signifie pas qu'il n'y a pas de fuseau horaire, mais qu'elle représente le fuseau horaire par défaut actuel.

//-----------------------------------------------------------------------
    /**
     * Obtains the current date from the system clock in the default time-zone.
     * <p>
     * This will query the {@link Clock#systemDefaultZone() system clock} in the default
     * time-zone to obtain the current date.
     * <p>
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @return the current date using the system clock and default time-zone, not null
     */
    public static LocalDate now() {
    
    
        return now(Clock.systemDefaultZone());
    }

Bien sûr, cette méthode now peut passer dans un fuseau horaire

public static LocalDate now(ZoneId zone) {
    
    
    return now(Clock.system(zone));
}

public static LocalDate now(Clock clock) {
    
    
   Objects.requireNonNull(clock, "clock");
    final Instant now = clock.instant();  // called once
    return ofInstant(now, clock.getZone());
}    

Puisque le fuseau horaire n'est pas représenté, même si le fuseau horaire est défini, la chaîne de sortie sera toujours la même :

fun main() {
    
    
    var now = LocalDate.now()
    println(now.toString())
    println(LocalDate.now(ZoneId.of("UTC")))
}

Le résultat est :

2022-02-02
2022-02-02

1.2 Heure locale

Obtenez l'heure actuelle :

fun main() {
    
    
    var now = LocalTime.now()
    println(now)
}

Le résultat est :

11:15:11.081522

Comme LocalDate, aucun des deux ne représente un fuseau horaire.

public static LocalTime now() {
    
    
    return now(Clock.systemDefaultZone());
}
public static LocalTime now(ZoneId zone) {
    
    
    return now(Clock.system(zone));
}
public static LocalTime now(Clock clock) {
    
    
   Objects.requireNonNull(clock, "clock");
    final Instant now = clock.instant();  // called once
    return ofInstant(now, clock.getZone());
}        

1.3 Obtention de LocalDateTime

fun main() {
    
    
    var now = LocalDateTime.now()
    println(now)
}

Le résultat est :

2022-02-02T11:22:22.287480

Quoi qu’il en soit, il n’indique pas le fuseau horaire, donc je ne suis plus content de publier le code source.

1.4 Conversion du temps

Comme vous pouvez le voir, LocalDateTime dispose de nombreuses méthodes et l'heure peut être construite via LocalDate et LocalTime.

fun main() {
    
    

    val localDate = LocalDate.now()
    val localTime = LocalTime.now()
    val localDateTime = LocalDateTime.of(localDate, localTime)
    println(localDateTime)
}

Le résultat de sortie est

2022-02-03T20:30:42.802526

2. Analyse du temps

Pour analyser l'heure du jour à venir à partir d'une chaîne, un modèle est nécessaire. Avant Java8, l'analyse syntaxique la plus couramment utilisée était SimpleDateFormat. Un exemple simple est le suivant :

fun main() {
    
    
    var simpleDateFormat = SimpleDateFormat("yyyy.MM.dd")
    simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
    println(simpleDateFormat.parse("2022.02.03"))
}

Résultats de sortie

Thu Feb 03 00:00:00 CST 2022

Vous pouvez voir l’heure CST. Je ne sais pas grand-chose sur cette heure, je ne recommande donc pas d’utiliser cette méthode.
La chose la plus importante est que cette classe SimpleDateFormat est une classe non thread-safe. Dans les codes Java8 et versions ultérieures, il est recommandé d'utiliser la classe thread-safe DateTimeFormatter.

2.1 LocalDateFormatter

fun main() {
    
    
    var dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")
    println(LocalDateTime.parse("2022.02.03 21:45:34", dateTimeFormatter))
}

L'heure analysée est :

2022-02-03T21:45:34

Il n’y a pas de notion de fuseau horaire pour le moment. Alors, que devez-vous faire si vous avez besoin d’un fuseau horaire ? Cela nous amène à ZonedDateTime.

3. ZonedDateTime

Les fuseaux horaires sont une grande invention, mais s'ils sont mal utilisés, ils peuvent prêter à confusion. Surtout lorsque les programmes sont déployés sur des serveurs dans des fuseaux horaires différents, il peut être un peu difficile de comparer les heures. ZonedDateTime, introduit dans Java 8, est une date et une heure standard avec fuseau horaire.

Une date-heure avec un fuseau horaire dans le système de calendrier ISO-8601, tel que 2007-12-03T10:15:30+01:00 Europe/Paris.
Cette classe gère la conversion de la chronologie locale de LocalDateTime vers la chronologie instantanée d'Instant. La différence entre les deux lignes temporelles est le décalage par rapport à UTC/Greenwich, représenté par un ZoneOffset

Une date/heure avec un fuseau horaire dans le système de calendrier ISO-8601, tel que 2007-12-03T10:15:30+01:00 Europe/Paris.
Cette classe gère la conversion de la chronologie locale de LocalDateTime vers la chronologie instantanée d'Instant. La différence entre les deux chronologies est le décalage par rapport à UTC/Greenwich, représenté par ZoneOffset

3.1 Simple à utiliser

fun main() {
    
    
    println(ZonedDateTime.now())
}

Résultats de sortie

2022-02-03T20:55:33.127310+08:00[Asia/Shanghai]

Comme vous pouvez le constater, la fonctionnalité la plus évidente ici est l'ajout du fuseau horaire. Consultez le code source :

 public static ZonedDateTime now() {
    
    
        return now(Clock.systemDefaultZone());
    }
public static ZonedDateTime now(Clock clock) {
    
    
        Objects.requireNonNull(clock, "clock");
        final Instant now = clock.instant();  // called once
        return ofInstant(now, clock.getZone());
    }    

Il s'agit du fuseau horaire actuel du système obtenu, puis je peux également définir le fuseau horaire manuellement :

public static ZonedDateTime now(ZoneId zone) {
    
    
        return now(Clock.system(zone));
    }

Tout de suite

fun main() {
    
    
    println(ZonedDateTime.now())
    println(ZonedDateTime.now(ZoneId.of("UTC")))
}

Le résultat de sortie est

2022-02-03T21:08:31.065378+08:00[Asia/Shanghai]
2022-02-03T13:08:31.065918Z[UTC]

Vous pouvez clairement voir la différence entre les fuseaux horaires, le décalage horaire est de 8 heures.

4. Utilisation réelle

4.1 Exigences

Convertissez le 3 février 2022 en ZonedDateTime.

4.2 Analyse

  • Si vous souhaitez spécifier le fuseau horaire, qui n'est pas mentionné ici, spécifiez clairement l'heure du huitième district Est pour empêcher différents serveurs de définir des proxys différents. N'utilisez pas la valeur par défaut du système.
  • Si les heures, les minutes et les secondes ne sont pas spécifiées, cela peut commencer à 0h00 minutes et 0 seconde.
  • Le code doit être aussi simple et clair que possible.

4.3 Réponses

fun main() {
    
    
    val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日")
    val localDate = LocalDate.parse("2022年02月03日", dateTimeFormatter)
    val localTime = LocalTime.of(0, 0, 0)

    println(ZonedDateTime.of(localDate, localTime, ZoneId.of("Asia/Shanghai")))

}

Le résultat de sortie est

2022-02-03T00:00+08:00[Asia/Shanghai]

Mais c'est un peu succinct. Vérifiez le code source et essayez d'écrire ce qui suit :


fun main() {
    
    
    val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日")
    val zonedDateTime = LocalDate.parse("2022年02月03日", dateTimeFormatter).atStartOfDay(ZoneId.of("Asia/Shanghai"))
    println(zonedDateTime)
}

Ne demandez pas, demander signifie toujours reconstruire.

Je suppose que tu aimes

Origine blog.csdn.net/Apple_wolf/article/details/122768163
conseillé
Classement