Heidisql: Visualización de marca de tiempo incorrecta como valor de fecha en la cuadrícula

Creado en 31 ene. 2018  ·  5Comentarios  ·  Fuente: HeidiSQL/HeidiSQL

Establecer "Esta es una columna de marca de tiempo de UNIX" activa en las opciones de la vista de cuadrícula para ver una marca de tiempo de UNIX como representación de la fecha.

Comportamiento esperado

El siguiente valor (marca de tiempo de Unix) se almacena como BIGINT en la base de datos:
1098655200
GMT: Domingo 24 de octubre de 2004 10:00:00 PM
Berlín: lunes 25 de octubre de 2004 12:00:00 a.m. GMT + 02:00 DST

La cuadrícula debería mostrarse aquí:
2004-10-24 22:00:00 (GMT) o
2004-11-25 00:00:00 (local)

Comportamiento actual

Muestra de cuadrícula:
2004-10-24 23:00:00

Parece que la zona horaria momentánea se usa para mostrar el valor, y esto es GMT + 1 a partir de hoy (2018-01-31) en Alemania, sin horario de verano.
El valor debe mostrarse de acuerdo con la zona horaria en la fecha especificada, que era GMT + 2, horario de verano activo.

pasos para reproducir

  1. Cree una columna BIGINT e inserte un valor de 1098655200
  2. Establezca "Opciones de vista de cuadrícula" en "Esta es una columna de marca de tiempo de UNIX"
  3. Obtendrá: 2004-10-24 23:00:00
  4. Esperado: 2004-11-25 00:00:00

Contexto

  • Versión de HeidiSQL: 9.5.0.5196
  • Sistema de base de datos + versión: MariaDB 10.2.12
  • Sistema operativo: Windows 10, Timezone Europe / Berlin
bug

Todos 5 comentarios

Hola @mpaland , ¿tu MariaDB se está ejecutando con la zona horaria correcta Europa / Berlín?
No manejo muchas conversiones, la marca de tiempo se escribe en UTC, ¿no es así? y MySQL se convierte a su zona horaria?

Traté de reproducir pero en los servidores que tengo no tienen las zonas horarias instaladas :(

@lukinhaspm no se trata del servidor, es solo una cuestión de la representación correcta de la marca de tiempo en HeidiSQL. Un TIMESTAMP de UNIX siempre debe estar en segundos después de 1970-01-01 00:00:00 UTC.

Puede presentar dicha marca de tiempo estrictamente en UTC, lo cual está bien, o en una determinada zona horaria (principalmente la propia). Al hacerlo, se necesita la zona horaria válida en la fecha de la marca de tiempo, no en la fecha real.
Parece que HeidiSQL toma la fecha real. Todavía no he mirado su código, así que es solo una especulación.

@mpaland ¡ Lo entiendo y estoy de acuerdo!

Investigué esto un poco más. Lamentablemente, la solución no parece fácil.
El problema son las complicadas reglas del DST (horario de verano) en todo el mundo y, lo que es peor, su forma no constante y en continuo cambio.
Para corregir el DST de la hora local para una determinada marca de tiempo de época, es necesario conocer la regla exacta de DST que se aplicó localmente a la hora de las marcas de tiempo.
Una biblioteca de conversión necesita realizar un seguimiento de todos los cambios en las reglas de DST en cada país a lo largo de los años para calcular la compensación para cualquier punto en el pasado.
Windows ignora completamente este problema y convierte siempre de acuerdo con la regla _actual_ DST en el momento de la conversión.
Para hacerlo bien, es necesario utilizar una de las bibliotecas de zona horaria / horario de verano realmente avanzadas de la red.

Aunque la mayor parte de lo que @mpaland ha declarado sobre la necesidad de conocer la regla DST aplicada al crear la marca de tiempo es técnicamente cierto (si eliminamos el horario de verano, por ejemplo, todos los momentos registrados mientras estaba activo "cambiarían" a la relativa no luz del día ahorrando tiempo), aún es posible usar las reglas actuales de DST para mostrar correctamente la hora de una marca de tiempo.

1584975600 y 1585576800 son las 16:00 en Europa / Madrid, pero heidisql representa incorrectamente uno de ellos (dependiendo de si estamos en horario de verano o no)

Podría ser posible mostrar correctamente estos casos sin que sea una gran molestia simplemente verificando si la hora resultante debe ser el horario de verano o no y aplicando la compensación correcta.

Aunque no es una solución perfecta, diría que probablemente cubre la mayoría de los casos de uso, y los casos extremos probablemente se detectarían fácilmente, es más una pequeña ayuda para que los desarrolladores verifiquen que algo está bien que una pantalla confiable para el usuario final de todos modos.

¿Fue útil esta página
0 / 5 - 0 calificaciones