LocalDateTime y ZonedDateTime

1.FechaHoralocal

LocalDateTime es una nueva representación de tiempo introducida en Java8. Sí, lo leíste bien, lo envía él mismo, yo uso Java8.
LocalDateTime, la traducción literal es la fecha y hora locales, dado que es la fecha y hora locales, no incluye el concepto de zona horaria.

Una fecha y hora sin zona horaria en el sistema de calendario ISO-8601, como 2007-12-03T10:15:30.
Esta clase no almacena ni representa una zona horaria. En cambio, es una descripción de la fecha, como se usa para los cumpleaños, combinada con la hora local como se ve en un reloj de pared. No puede representar un instante en la línea de tiempo sin información adicional, como un desplazamiento o una zona horaria.

En el sistema de calendario estándar ISO-8601, la fecha y la hora no tienen zonas horarias, al igual que 2007-12-03T10:15:30.
Esta clase no almacena ni representa zonas horarias. En cambio, es una descripción de la fecha, utilizada para los cumpleaños, combinada con la hora local en un reloj de pared. Sin información adicional, como el desplazamiento o la zona horaria, no puede representar un instante en la línea de tiempo.

LocalDateTime consta de dos partes: LocalDate y LocalTime

1.1 Fecha local

Obtener la fecha actual

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

La salida es:

2022-02-02

Lo que aquí se representa es la fecha actual, 2 de febrero de 2022, pero esto no significa que no exista zona horaria, sino que representa la zona horaria predeterminada actual.

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

Por supuesto, este método ahora puede pasar en una zona horaria.

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

Dado que la zona horaria no está representada, incluso si se establece la zona horaria, la cadena de salida seguirá siendo la misma:

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

La salida es:

2022-02-02
2022-02-02

1.2 Hora local

Obtener la hora actual:

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

La salida es:

11:15:11.081522

Al igual que LocalDate, ninguno representa una zona horaria.

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 Obtención de fecha y hora local

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

La salida es:

2022-02-02T11:22:22.287480

De todos modos, no indica la zona horaria, por lo que ya no estoy feliz de publicar el código fuente.

1.4 Conversión de tiempo

Como puede ver, LocalDateTime tiene muchos métodos y el tiempo se puede construir a través de LocalDate y LocalTime.

fun main() {
    
    

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

El resultado de salida es

2022-02-03T20:30:42.802526

2. Análisis del tiempo

Para analizar la hora del día anterior a partir de una cadena, se necesita un patrón. Antes de Java8, el análisis más utilizado era SimpleDateFormat, un ejemplo simple es el siguiente:

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

Resultados de salida

Thu Feb 03 00:00:00 CST 2022

Puedes ver la hora CST, no sé mucho sobre esta hora, por lo que no recomiendo usar este método.
Lo más importante es que esta clase SimpleDateFormat es una clase que no es segura para subprocesos. En códigos Java8 y posteriores, se recomienda utilizar la clase segura para subprocesos DateTimeFormatter.

2.1 Formato de fecha local

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

El tiempo analizado es:

2022-02-03T21:45:34

No existe ningún concepto de zona horaria en este momento. Entonces, ¿qué debes hacer si necesitas una zona horaria? Eso nos lleva a ZonedDateTime.

3. Fecha y hora de zona

Las zonas horarias son un gran invento, pero si se usan incorrectamente pueden causar confusión. Especialmente cuando los programas se implementan en servidores en diferentes zonas horarias, puede resultar un poco problemático comparar horas. ZonedDateTime, introducido en Java 8, es una fecha y hora estándar con zona horaria.

Una fecha y hora con una zona horaria en el sistema de calendario ISO-8601, como 2007-12-03T10:15:30+01:00 Europa/París.
Esta clase maneja la conversión de la línea de tiempo local de LocalDateTime a la línea de tiempo instantánea de Instant. La diferencia entre las dos líneas de tiempo es el desplazamiento de UTC/Greenwich, representado por un ZoneOffset

Una fecha y hora con una zona horaria en el sistema de calendario ISO-8601, como 2007-12-03T10:15:30+01:00 Europa/París.
Esta clase maneja la conversión de la línea de tiempo local de LocalDateTime a la línea de tiempo instantánea de Instant. La diferencia entre las dos líneas de tiempo es el desplazamiento de UTC/Greenwich, representado por ZoneOffset

3.1 Fácil de usar

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

Resultados de salida

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

Como puede ver, la característica obvia aquí es la adición de zona horaria. Vea el código fuente:

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

Esta es la zona horaria actual del sistema obtenida, luego también puedo configurar la zona horaria manualmente:

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

Ahora mismo

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

El resultado de salida es

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

Se puede ver claramente la diferencia de zonas horarias, la diferencia horaria es de 8 horas.

4.Uso real

4.1 Requisitos

Convierta el 3 de febrero de 2022 a ZonedDateTime.

4.2 Análisis

  • Si desea especificar la zona horaria, que no se menciona aquí, especifique claramente la hora del Octavo Distrito Este para evitar que diferentes servidores configuren diferentes servidores proxy. No utilice el valor predeterminado del sistema.
  • Si no se especifican las horas, minutos y segundos, se puede iniciar desde 0:00 minutos y 0 segundos.
  • El código debe ser lo más simple y claro posible.

4.3 Respuestas

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

}

El resultado de salida es

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

Pero esto es un poco conciso. Verifique el código fuente e intente escribir lo siguiente:


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

No preguntes, preguntar es siempre reconstruir.

Supongo que te gusta

Origin blog.csdn.net/Apple_wolf/article/details/122768163
Recomendado
Clasificación