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 ZONE
y 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_Angeles
que ocho horas detrás de UTC con una compensación de -08:00
. Pero en lugar del -08:00
desplazamiento 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 0001
a 0001 BC
; sin año cero 0000
.
"0001-12-31 23:00:00+00 BC"
fuente
0000
un 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)Respuestas:
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:
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).
fuente