Red de conocimiento informático - Aprendizaje de código fuente - Ya no quiero pisar los peligros de las zonas horarias.

Ya no quiero pisar los peligros de las zonas horarias.

Cuando utilicé el comando de fecha recientemente, descubrí que el Distrito 8 Este (zona horaria de China) necesita usar GMT-8, pero en Java, necesita usar GMT+8, de la siguiente manera:

Y en Java, es el siguiente:

Esto es un poco confuso Después de buscar durante un período de tiempo, descubrí que todavía hay muchos puntos de conocimiento en la forma de expresión de tiempo. ¡zona!

Como todos sabemos, para facilitar la conversión entre horas locales en varias regiones, la gente ha dividido el mundo en 24 zonas horarias, con el Observatorio de Greenwich (GMT) como zona horaria cero, hay 12. zonas horarias en las direcciones este y oeste. Entonces, naturalmente, hay una representación de zona horaria con el prefijo GMT, de la siguiente manera:

GMT+8 representa la octava zona este, que es la zona horaria utilizada por China, y GMT-8 representa la octava zona oeste. Si el área local del Observatorio de Greenwich es la hora 0 en punto el 2022-03-19, entonces la hora local en el área GMT + 8 es la hora 8 en punto en 2022. -03-19, y la hora local en GMT-8 está adelantada 8 horas, es decir, 16 del punto 2022-03-18.

Tenga en cuenta que, aunque las expresiones de hora local en cada región anterior son diferentes, en realidad son la misma hora (hora absoluta). Debe comprender la diferencia entre hora local y hora absoluta.

GMT+8 es la representación de zona horaria admitida en Java, entonces, ¿por qué es GMT-8 en Linux? De hecho, GMT-8 en Linux también se puede escribir como Etc/GMT-8. Este es su nombre estándar, de la siguiente manera:

Se puede encontrar que si se usa Etc/GMT-8, el. La salida de Linux y Java será la misma, sí, Etc/GMT-8 también es un mecanismo de representación de zona horaria similar a GMT+8, excepto que su signo +- está invertido.

Bien, aunque las diferencias anteriores se han aclarado, la representación de la zona horaria aún no se ha introducido. Sigamos leyendo...

Además de la representación GMT+8, tenemos. También es común ver representaciones como UTC+8, que es la representación de la zona horaria UTC.

¿Cómo se puede generar GMT y UTC? Esto se debe a que GMT se basa en el Observatorio de Greenwich como base de tiempo, pero la Tierra no es una esfera perfecta y la velocidad de rotación está disminuyendo, por lo que la velocidad de rotación de la Tierra no es uniforme, lo que dificulta el uso del Observatorio de Greenwich como base de tiempo. incorrecto.

Para medir el tiempo con mayor precisión, los científicos inventaron la hora UTC, que utiliza el número de transiciones atómicas de cesio para medir el tiempo, que es más precisa que la hora GMT. Para garantizar la precisión de GMT, GMT. el tiempo se mide cada pocos años una vez ajustado para alinearse con la hora UTC.

Por lo tanto, ahora que existe un UTC más preciso, hay una representación de zona horaria con el prefijo UTC. Por ejemplo, la zona horaria china puede usar UTC+8.

A continuación se muestra una lista de representaciones de desplazamiento de zona horaria:

Además de utilizar desplazamientos para representar zonas horarias, por conveniencia, las personas también definen zonas horarias por región/ciudad, como Asia/Shanghai y Asia/Hong_Kong representan el Distrito 8 del Este. Las zonas horarias específicas con nombres de ciudades se pueden ver en la base de datos de zonas horarias.

Además, para simplificar la representación de las zonas horarias regionales, se definen un conjunto de abreviaturas de zonas horarias. Por ejemplo, CST es la abreviatura de China Standard Time, China Time Zone. Puede ver varias. definiciones de abreviaturas en Abreviaturas de zona horaria.

Tenga en cuenta que, por lo general, no se recomienda utilizar abreviaturas de zona horaria porque la denominación de las abreviaturas de zona horaria se repite con frecuencia. Por ejemplo, CST es la hora estándar central (hora estándar central de América del Norte UTC -6), China. Hora estándar (hora estándar de China UTC +8), hora estándar de Cuba (hora estándar de Cuba UTC -5).

Dado que diferentes software pueden interpretar CST de manera diferente, habrá una diferencia horaria de 13 o 14 horas. Esto ocurre a menudo cuando Java se combina con MySQL. También escribí un artículo especial sobre la marca de tiempo de MySQL. ¿Habrá problemas con la zona horaria? , para escenarios en los que se deben utilizar abreviaturas de zona horaria, puede utilizar la abreviatura de zona horaria de Hong Kong HKT, que no se repite y se encuentra en la misma zona horaria que Shanghai.

Las clases relacionadas con las zonas horarias en Java incluyen TimeZone y ZoneId. TimeZone es la antigua clase de zona horaria y ZoneId es la nueva clase de zona horaria. Tiene dos subclases, ZoneOffset y ZoneRegion, que representan compensaciones respectivamente. Representación y representación del área.

¿Cuál de los métodos de escritura de zona horaria anteriores son compatibles? Escriba una demostración para verificarlo, de la siguiente manera:

El resultado es el siguiente:

Aunque tanto la representación de desplazamiento como la representación de área pueden representar zonas horarias, debido a la existencia del horario de verano , no hacen exactamente lo mismo.

El horario de verano (DST), también llamado horario de verano, se refiere a que para ahorrar energía, en las primeras horas de la mañana del verano, se adelanta artificialmente una hora la hora para completar Uso de recursos luminosos. Ahorro de electricidad en iluminación.

China también implementó el horario de verano de 1986 a 1991. De 1986 a 1991, cada año a partir de las 2:00 a. m. del primer domingo de mediados de abril (hora de Beijing), los relojes se adelantaban un día. hora, es decir, cuando las manecillas del reloj se ajustan entre las 2 y las 3 en punto, el horario de verano comienza a las 2:00 a. m. del primer domingo de mediados de septiembre (horario de verano de Beijing), el reloj se retrasa una hora, es decir, las manecillas del reloj se ajustan de las 2 a las 3. A la 1, finaliza el horario de verano. En los seis años comprendidos entre 1986 y 1991, excepto 1986, que fue el primer año en implementar el horario de verano, que comenzó el 4 de mayo y finalizó el 14 de septiembre, los demás años se implementaron según el período prescrito.

Por lo tanto, se producirá el siguiente fenómeno extraño:

¿Por qué la salida de Asia/Shanghai es a las 3 en punto y la salida de GMT+8 es a las 2 en punto? La razón es que a las 02:00:00 del 4 de mayo de 1986, China está comenzando a implementar el horario de verano y el reloj se adelanta una hora.

¿Y por qué la salida de GMT+8 es de 2 puntos? Debido a que las zonas horarias de China, Malasia, Filipinas y Singapur son todas GMT+8, solo China implementa el horario de verano y la información regional no se puede detectar en GMT+8, por lo que Java solo puede calcular la hora local de una manera que no lo haga. No implementar el horario de verano. Ya es hora.

Es precisamente debido a la existencia del horario de verano que pueden ocurrir fenómenos extraños o incluso errores en el programa, como se muestra a continuación:

El resultado es el siguiente:

¿Por qué sucede esto? La razón es que aunque la hora local parece haber seguido siendo la misma, la zona horaria representada por Asia/Shanghai ha cambiado.

Podemos cambiar el formato de hora en el printZonedDateTime anterior de yyyy-MM-dd HH:mm:ss VV a yyyy-MM-dd HH:mm:ss VV xxx y luego ejecutarlo nuevamente. es el siguiente:

p>

Como arriba, el horario de verano significa que la zona horaria de Asia/Shanghai no es necesariamente la Zona Este 8, sino que también puede ser la Zona Este 9. Por lo tanto, en Java Si desea convertir ZoneRegion a ZoneOffset, debe pasar un parámetro de tiempo instantáneo, de la siguiente manera:

El horario de verano es realmente un autoengaño. ¡Afortunadamente, China no lo ha implementado desde 1991!