La zona horaria de PostgreSQL no coincide con la zona horaria del sistema

17

Tengo varias instalaciones de PostgreSQL 9.2 donde la zona horaria utilizada por PostgreSQL es GMT, a pesar de que todo el sistema es "Europa / Viena". Verifiqué dos postgresql.confveces que no contenga timezoneconfiguración, por lo que, según la documentación, debería recurrir a la zona horaria del sistema.

Sin embargo,

# su -s /bin/bash postgres -c "psql mydb"

mydb=# show timezone;
 TimeZone 
----------
 GMT
(1 row)

mydb=# select now();
              now              
-------------------------------
 2013-11-12 08:14:21.697622+00
(1 row)

¿Alguna pista de dónde podría venir la zona horaria GMT? El usuario del sistema no han TZestablecido y el /etc/timezoney /etc/timeinfoparecen estar configurado correctamente.

# cat /etc/timezone 
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013

Cualquier sugerencia es apreciada, gracias de antemano!

Martin C.
fuente

Respuestas:

24

El valor predeterminado para la TimeZoneconfiguración ha cambiado en la versión 9.2:

(..) Si no se establece explícitamente, el servidor inicializa esta variable en la zona horaria especificada por su entorno del sistema. (...)

(...) El valor predeterminado incorporado es GMT, pero eso generalmente se anula en postgresql.conf; initdb instalará allí una configuración correspondiente a su entorno del sistema. (...)

Lo que significa que antes de la versión 9.2, el valor predeterminado en postgresql.confdebe establecerse durante la initdbfase. Si anuló ese valor (probablemente copiando el antiguo postgresql.confmientras actualizaba desde versiones anteriores) PostgreSQL usará el valor "GMT" por defecto.

La solución para su caso es bastante simple, simplemente cambie la TimeZoneconfiguración postgresql.confal valor que desee:

TimeZone = 'Europe/Vienna'

Después de eso, necesita reloadel servicio:

# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"

Entonces, todos los campos almacenados como timestamp with time zone(o timestamptz) se mostrarán correctamente a partir de ahora. Pero deberá corregir a mano todos (actualizar) los campos almacenados como timestamp without time zone(o timestamp).

Un consejo que doy a todos los que actualicen PostgreSQL es que no copie el viejo postgresql.confal nuevo clúster (tenga en cuenta que no estoy seguro de si fue lo que hizo, pero vi este mismo problema mucho por eso). Simplemente obtenga el generado por initdby agregue las modificaciones (una diffherramienta puede ser útil para esta tarea).

MatheusOl
fuente
Muchas gracias, no noté este cambio de 9.1 a 9.2. Sí, agregar la información de zona horaria a postgresql.conf es una solución trivial, simplemente no podía explicar por qué volvería a GMT. Aparentemente me topé con la documentación 9.1 todo el tiempo, ya que no hubiera esperado un cambio tan radical de 9.1 a 9.2 en el comportamiento predeterminado.
Martin C.
Sin embargo, su base de datos siempre debe estar en UTC (GMT). Hace que los tiempos sean más fáciles de comparar. Siempre se puede cambiar la zona horaria del cliente / sesión. Establezca la zona horaria x en pág. stackoverflow.com/questions/2532729/…
Neil McGuigan el
¿Hay alguna forma de especificar en la postgresql.confversión 9.2+ que la zona horaria del entorno del sistema todavía se debe detectar automáticamente?
Kyle Strand
0

Encontré una solución para esto.

simplemente cree un enlace simbólico dentro de / usr / share / zoneinfo / named localtime (o el nombre que desee) que apunte a / etc / localtime

/usr/share/zoneinfo/localtime -> /etc/localtime

de esta manera, está creando una cadena de enlaces que finalmente apunta a la zona horaria de su sistema.

/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles

Ahora tome el nombre del enlace que creó ( localtime en mi caso) y úselo como el valor del elemento de configuración en postgresql.conf

TimeZone = 'localtime'

reinicie postgresql y verifique la hora con "SELECT now ();" y "mostrar zona horaria";

MatteoBee
fuente