¿Por qué la zona horaria tiene un desplazamiento tan loco de UTC en el año 0001 en Postgres?


16

En Postgres 9.5, me sorprendió ver el resultado que se ve a continuación al experimentar con el año 0001(sin año cero 0000).

Compensación de -07:52:58?

Algún código de ejemplo. Tenga en cuenta que mezclé el uso de TIMESTAMP WITH TIME ZONEy TIMESTAMP WITHOUT TIME ZONE, así que lea detenidamente.

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

Estoy sorprendido por que el segundo valor: 0001-12-31 16:07:02-07:52:58 BC. Entiendo que debemos retroceder ocho horas al igual America/Los_Angelesque ocho horas detrás de UTC con una compensación de -08:00. Pero en lugar del -08:00desplazamiento es -07:52:58. ¿Por qué?

No hay problema bajo UTC

No existe tal problema al ingresar datos bajo UTC.

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

No Year Zero

Por cierto, la parte de la fecha parece ser correcta. Parece que no hay año 0000, ese es el punto de pivote entre las eras "BC" y "AD". Tome el primer momento del año 0001, reste una hora y obtendrá el año 0001 BC, así que no hay año cero.

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

El resultado es el año 0001 BC, entonces saltamos de 0001a 0001 BC; sin año cero 0000.

"0001-12-31 23:00:00+00 BC"

Además, un buen video sobre la locura de las zonas horarias
billinkc

El punto de pivote entre BC y AD es el año 1. Es el año 1 o el año -1. Es solo cómo se nombran los años originalmente. El año 0 no existe (o más bien, no está definido, ya que es más un problema de definición que existencial).
slebetman 02 de

¿Recuerdas en las celebraciones del 2000 cuando algunas personas pedantes dijeron que el segundo milenio técnicamente comienza en el año 2001, no en el 2000? Es por eso. Los años comienzan en 1, no en 0. Y el año anterior al año 1 es el año 1 aC (es decir, año -1)
slebetman

1
@slebetman que depende del calendario en uso. El gregoriano proleptico tiene tanto una forma que usa 0 como el año anterior a 1 CE, como una forma que coloca 1 BCE inmediatamente antes de 1 CE (ISO 8601 admite que ambos tengan 0000un valor de año válido pero no insistan en si se usa o no) ) Es cierto que PostgreSQL usa el formulario sin año 0, pero no puede indicar "años comienzan con 1, no con 0" como si fuera una especie de hecho universal. Es fácil traducir entre ellos, por ejemplo, datos astronómicos. (El tercer milenio aún comenzó en 2001 de cualquier manera, ya que siguió siendo el tercer milenio desde 1 CE)
Jon Hanna

@JonHanna: Nadie estaba usando ninguna forma del calendario gregoriano proleptico en ese momento, sin embargo, creo que es justo privilegiar el calendario juliano aquí, que no tiene un año cero.
Kevin

Respuestas:


22

El 18 de noviembre de 1883 a las 12:00 (hora nueva), los ferrocarriles estadounidenses adoptaron la hora estándar.

Esto significa que antes de esa hora, Los Ángeles usaba la hora local real, basada en la hora solar media. Después de eso, se trasladó a su zona horaria local, que, siendo un desplazamiento integral de horas desde la hora media de Greenwich, era ligeramente diferente de la hora anterior.

¿Quiere saber más?

  • Descargue la base de datos de zonas horarias tzdata de IANA: zonas horarias .

  • En el interior, encontrará las definiciones de las (muchas) zonas horarias, que tienen muchas variaciones a lo largo del tiempo, junto con muchos comentarios que detallan qué cambios se realizaron y cuándo. ¡Es una lectura entretenida!

  • Wikipedia también tiene algunos datos interesantes, en la página Wikipedia: Zona horaria , con respecto al cambio de 1883 y 18 de noviembre:

Tiempo ferroviario
... El
cronometraje en los ferrocarriles estadounidenses a mediados del siglo XIX era algo confuso. Cada ferrocarril utilizó su propio horario estándar, generalmente basado en la hora local de su sede o terminal más importante, y los horarios de trenes del ferrocarril se publicaron utilizando su propio horario. Algunos cruces atendidos por varios ferrocarriles tenían un reloj para cada ferrocarril, cada uno mostrando una hora diferente.
... El sistema de Dowd nunca fue aceptado por los ferrocarriles estadounidenses. En cambio, los ferrocarriles estadounidenses y canadienses implementaron una versión propuesta por William F. Allen, el editor de la Guía Ferroviaria Oficial del Viajero. Las fronteras de sus zonas horarias atraviesan estaciones de ferrocarril, a menudo en las principales ciudades. Por ejemplo, la frontera entre sus zonas horarias oriental y central atraviesa Detroit, Buffalo, Pittsburgh, Atlanta y Charleston. Fue inaugurado el domingo 18 de noviembre de 1883 , también llamado "El día de las dos del mediodía" , cuando el reloj de cada estación de ferrocarril se reiniciaba a medida que se alcanzaba el mediodía a la hora estándar dentro de cada zona horaria. Las zonas fueron nombradas Intercolonial, Oriental, Central, Montaña y Pacífico. ...

También tenga en cuenta que esto no es específico de Postgresql. Esto es válido para cualquier software o sistema operativo que use la base de datos tzdata (aunque, por supuesto, muchos se limitarán a fechas posteriores a 1970 o posteriores a 1901, por lo que 1883 está fuera del alcance, pero hay muchos, muchos otros ajustes por todas partes en tiempos diferentes).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.