Annuaire d'articles
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 ZoneOffsetUne 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.