Solución de zona horaria unificada del proyecto web Springboot

fondo

Durante la internacionalización del proyecto Springboot, habrá inconsistencias entre el tiempo seleccionado por el usuario y el tiempo finalmente guardado en la base de datos. Puede ser que la zona horaria durante el desarrollo e implementación del proyecto no se manejó adecuadamente, lo que resultó en problemas de conversión de tiempo. .

Primero comprenda qué zonas horarias son:

1.GMT: hora media de Greenwich

Hora media de Greenwich; Greenwich, Londres, Inglaterra se establece como el lugar donde comienza la longitud 0°. La Tierra se divide en una zona horaria cada 15° de longitud y se divide en 24 zonas horarias. La diferencia entre zonas horarias adyacentes es de una hora. ; por ejemplo: Beijing, China está ubicada en el Octavo Distrito Este, la hora GMT está 8 horas por detrás de la hora de Beijing.

2.UTC: Hora Universal Coordinada

Hora Universal Coordinada: la hora obtenida mediante cálculos rigurosos tiene una precisión de segundo, con un error de 0,9 s. Es una hora mundial más precisa que GMT.

3.DST: Horario de verano

Horario de verano, es decir, horario de verano, es adelantar la hora una hora para aprovechar la abundante luz del verano, muchos países de Norteamérica y Europa implementan el horario de verano;

4.CST: Abreviatura de cuatro zonas horarias diferentes:
Hora estándar central (EE. UU.) UT-6:00
Hora estándar central (Australia) UT+9:30 Hora estándar de Australia Hora estándar de
China UT+8:00 Hora estándar de China Hora estándar
de Cuba UT-4:00 hora estándar de Cuba

analizar

Dibuje el proceso de flujo de los datos de tiempo del usuario, como se muestra en la figura.

Hay varias ubicaciones de almacenamiento para zonas horarias : cliente, servidor, JVM. mysql

Proceso : el navegador del usuario obtiene la hora actual según la zona horaria del cliente --- "Pase los parámetros de hora al servidor --" JVM selecciona la zona horaria actual del servidor o la zona horaria establecida por sí misma de acuerdo con la configuración - -- " Almacene la hora en mysql, mysql tiene su propia zona horaria cuando está instalado

Requisitos : Se necesita tiempo para garantizar la coherencia al pasar y sacar.

Solución : Luego debe asegurarse de que se puedan convertir diferentes zonas horarias hacia adelante y hacia atrás o que las zonas horarias sean consistentes y no se realice ninguna conversión .

Proceso de resolución

1.Cliente

Esta es la computadora del usuario. No podemos preguntarle al usuario qué zona horaria usar, por lo que no se puede modificar. Los usuarios pueden usar varias zonas horarias . Esta es la razón de los cambios de tiempo y es también el factor fundamental que conduce a la desunión .

2. Servidor y JVM

Hay dos formas en el servidor.

(1) La JVM está en el servidor. Si la JVM no establece una zona horaria, la zona horaria del servidor actual se seleccionará de forma predeterminada.

(2) Configure la zona horaria de la JVM, que bloqueará la zona horaria del servidor. La zona horaria del servidor no afectará la zona horaria de la JVM y no afectará el flujo de los parámetros de tiempo del usuario. Seleccione esto .

[Original]El proyecto Java unifica el esquema de hora UTC

3.Mysql

Consultar zona horaria :show variables like '%time_zone%';

Establezca la zona horaria de mysql : la zona horaria predeterminada de MySQL es la zona horaria UTC
    
(1) Modificación permanente: modifique el archivo de configuración de mysql my-default.ini, agregue: default-time-zone='+08:00', reinicie mysql para tenga efecto, tenga en cuenta Asegúrese de agregarlo en [mysqld]; de lo contrario, aparecerá la variable desconocida 'default-time-zone=+8:00'

my-default.ini文件内:
[mysqld] 
default-time-zone='+08:00'

(2) Modificación temporal: ejecute el comando mysql set global time_zone = '+08:00', que entrará en vigor inmediatamente y dejará de ser válido después de reiniciar mysql.

set time_zone = '+8:00';
set global time_zone='+08:00';

Resumen de configuración de la zona horaria : si el cliente no lo configura, el usuario puede cambiar la zona horaria a voluntad --" Establezca la zona horaria de JVM en UTC ---" Establezca la zona horaria permanente de mysql en UTC

proceso de resolución de código

1. El cliente selecciona la hora en la zona horaria local.

2. El componente de front-end determina la hora para convertir a la zona horaria UTC.

3. Cuando el front-end lo pasa al back-end, el back-end usa la anotación @DateTimeFormat para convertir el formato, pero esto no puede manejar zonas horarias.

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date date;

4. La JVM backend está configurada en

@SpringBootApplication
public class Application {
 @PostConstruct
 void started() {
      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
 } 
  public static void main(String[] args) { 
  SpringApplication.run(Application.class, args); 
} 
}

5. El código se conecta a la URL de la base de datos. useLegacyDatetimeCodeEl parámetro predeterminado es true. Necesitamos configurarlo manualmente false, de lo contrario no será válido.

spring.datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC

6.mysql establece la zona horaria de almacenamiento en UTC

7. Desde la base de datos hasta el servidor, el backend del servidor (el proceso anterior no cambiará aleatoriamente, solo es necesario) usa @JsonFormat y corrige la zona horaria al regresar al frontend.

@JsonFormat(
    pattern = "yyyy-MM-dd HH:mm:ss",
    timezone = "GMT+8"
)
private Date date;

Supongo que te gusta

Origin blog.csdn.net/Mint6/article/details/114005134
Recomendado
Clasificación