zona horaria predeterminada de postgres

99

Lo instalé PostgreSQL 9y la hora que muestra es 1 hora por detrás de la hora del servidor.

Ejecución de Select NOW()espectáculos:2011-07-12 11:51:50.453842+00

La fecha del servidor muestra: Tue Jul 12 12:51:40 BST 2011

Está 1 hora por detrás, pero la zona horaria que se muestra phppgadmines:TimeZone Etc/GMT0

He intentado entrar en el postgresql.confy configurar

zona horaria = GMT

luego ejecutando un reinicio pero sin cambios.

¿Alguna idea que pensé que solo habría usado la zona horaria del servidor, pero obviamente no?

¡SOLUCIÓN !: Me puse a GMTantes y estaba una hora atrasado. después de buscar, resulta que necesitaba configurarlo Europe/London. Esto tiene en cuenta la hora +1 en el horario de verano británico, ¡GMT no!

Torres Blu
fuente

Respuestas:

113

La zona horaria es un parámetro de sesión. Por tanto, puede cambiar la zona horaria de la sesión actual.

Ver el doc .

set timezone TO 'GMT';

O, siguiendo más de cerca el estándar SQL, use el SET TIME ZONEcomando. Observe dos palabras para "ZONA HORARIA" donde el código anterior usa una sola palabra "zona horaria".

SET TIME ZONE 'UTC';

El doc explica la diferencia:

SET TIME ZONE extiende la sintaxis definida en el estándar SQL. El estándar solo permite compensaciones numéricas de zona horaria, mientras que PostgreSQL permite especificaciones de zona horaria más flexibles. Todas las demás funciones de SET son extensiones de PostgreSQL.

Muhammad Usama
fuente
2
He intentado configurar eso y no parece funcionar, tampoco lo hace solo para la sesión activa. Deseo cambiarlo permanentemente para todas las bases de datos, etc., lo hice fácilmente en phpmyadmin pero parece que no puedo encontrar una manera de hacerlo para postgresql
Blu Towers
yup 'set timezone To ..' solo establece la zona horaria para la sesión actual y si cambia el parámetro de configuración de la zona horaria en Postgresql.conf, debería cambiar la zona horaria para todas las bases de datos.
Muhammad Usama
4
Lo intenté cambiando la zona horaria a GMT en postgresql.conf y parece que funciona bien.
Muhammad Usama
Más estándar (compatible con las especificaciones SQL) es dos palabras para "TIEMPO DE ZONA": SET TIME ZONE 'UTC';. Ver el doc .
Basil Bourque
102

Elija uno timezonede:

SELECT * FROM pg_timezone_names;

Y setcomo a continuación se muestra el ejemplo:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

Utilice su nombre de base de datos en lugar de postgresen la declaración anterior.

Iurii Perevertailo
fuente
4
Debe reiniciar el servicio postgresql una vez hecho esto
Joey Pinto
24
@JoeyPinto no es cierto, basta con emitir SELECT pg_reload_conf();:)
Alphaaa
4
Me encontré con la declaración con mi nombre de base de datos y SELECT pg_reload_conf()regresar cierto, pero now()y select current_setting('TIMEZONE')seguir para devolver valores de 'América / New_York'. ¿Es porque no soy superusuario?
Noumenon
48

Para lograr el cambio de zona horaria en Postgres 9.1, debe:

1.- Busca en tu carpeta "timezones" en /usr/share/postgresql/9.1/ el archivo correspondiente, en mi caso sería "America.txt", en él busca la ubicación más cercana a tu zona y copia el primeras letras en la columna de la izquierda.

Por ejemplo: si estás en "Nueva York" o "Panamá" sería "EST":

#  - EST: Eastern Standard Time (Australia)
EST    -18000    # Eastern Standard Time (America)
                 #     (America/New_York)
                 #     (America/Panama)

2.- Descomente la línea "timezone" en su postgresql.confarchivo y ponga su zona horaria como se muestra:

#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
timezone = 'EST'
#timezone_abbreviations = 'EST'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia

3.- Reiniciar Postgres

guerrerocarlos
fuente
3
Esta es en realidad la respuesta correcta, ya que hace que el cambio de TZ sea predeterminado para cada proceso en PGSQL, no solo para el usuario actual.
jfreak53
15
Le sugiero que evite esos códigos de 3 o 4 letras por completo. No están estandarizados ni son únicos. En su lugar, utilice los nombres de zona horaria adecuados (continente SLASH ciudad o región). Para usar su propio ejemplo, Panamá usa un desplazamiento de todo el −05:00año, mientras que Nueva York cambia una hora con el horario de verano (DST). Una zona horaria es más que un desplazamiento; una zona horaria incluye el conjunto de reglas y anomalías pasadas, presentes y futuras, como el horario de verano. Por lo tanto, decir lo que se refiere a: America/Panama, America/New_York, Europe/London, UTC(o Zulu).
Basil Bourque
3
Según los documentos de PostGRE , puede verificar una vista interna para obtener una lista de los nombres de zonas horarias reconocidas en su base de datos específica haciendo lo SELECT * FROM pg_timezone_namesque probablemente sea más seguro, dado que los sitios de terceros no necesariamente estarán tan actualizados (o desactualizado) como su propia instancia de base de datos particular.
SeldomNeedy
No tengo esa carpeta compartidapostgresql
SuperUberDuper
En lugar de reiniciar PostgreSQL, puede ejecutar select pg_reload_conf().
ANVes
42

La respuesta aceptada por Muhammad Usama es correcta.

Nombre del parámetro de configuración

Esa respuesta muestra cómo establecer un parámetro de configuración específico de Postgres con lo siguiente:

SET timezone TO 'UTC';

… Donde timezoneno es un comando SQL, es el nombre del parámetro de configuración.

Consulte el documento para esto .

Comando SQL estándar

Como alternativa, puede utilizar el comando SQL definido por la especificación SQL: SET TIME ZONE. En esta sintaxis, un par de palabras TIME ZONEreemplazan "timezone" (comando SQL real frente al nombre del parámetro), y no hay "TO".

SET TIME ZONE 'UTC';

Tanto este comando como el anterior tienen el mismo efecto, para establecer el valor solo para la sesión actual. Para que el cambio sea permanente, consulte esta respuesta de hermanos .

Consulte el documento para esto .

Nombre de la zona horaria

Puede especificar un nombre de zona horaria adecuado . La mayoría de estos son continentes / regiones.

SET TIME ZONE 'Africa/Casablanca';

…o…

SET TIME ZONE 'America/Montreal';

Evitar las 3 o 4 letras abreviaturas tales como ESTo IST, ya que no están estandarizados ni única. Consulte Wikipedia para obtener una lista de los nombres de las zonas horarias .

Obtener zona actual

Para ver la zona horaria actual de una sesión, pruebe cualquiera de las siguientes declaraciones. Técnicamente, estamos llamando al SHOWcomando para mostrar un parámetro de tiempo de ejecución.

SHOW timezone ;

…o…

SHOW time zone ;

Estados Unidos / Pacífico

Albahaca Bourque
fuente
4
punto de bonificación por ser la única respuesta para proporcionar el SHOWpapel
Ariel Allon
Entendido, Ariel Allon - y, para el próximo chico que quiera seleccionar esa zona horaria en una variable ...SELECT current_setting('TIMEZONE')
Wellspring
10

Además de las respuestas anteriores, si usa la herramienta pgAdmin III , puede configurar la zona horaria de la siguiente manera:

  1. Abra la configuración de Postgres a través de Herramientas> Configuración del servidor> postgresql.conf
  2. Busque la zona horaria de entrada y haga doble clic para abrir
  3. Cambiar el valor
  4. Recargue el servidor para aplicar los cambios de configuración (botón Reproducir en la parte superior o mediante servicios)

Configuración de Postgres en pgAdmin III

Pascal
fuente
3

Tenga en cuenta que muchos clientes de terceros tienen su propia configuración de zona horaria que se superpone a cualquier servidor de Postgres y / o configuración de sesión.

Por ejemplo, si está utilizando 'IntelliJ IDEA 2017.3' (o DataGrips), debe definir la zona horaria como:

'Propiedades de la fuente de base de datos' -> pestaña 'Avanzado' -> 'Opciones de VM': -Duser.timezone = UTC + 06: 00

de lo contrario, verá 'UTC' a pesar de lo que haya configurado en cualquier otro lugar.

ARA1307
fuente
¿Entonces esto debe mantenerse sincronizado con los cambios de horario de verano / invierno?
Cpt. Senkfuss
1
@ Cpt.Senkfuss, creo que algo como -Duser.timezone = Australia / Tasmania también debería funcionar y encargarse de los cambios de verano / invierno.
ARA1307
Este es un truco para salvar vidas. He estado tratando de entender lo que está mal por ahora 3 horas :) por cierto, probé el nombre completo de la zona horaria y funciona. para mí es -Duser.timezone = Europe / Istanbul
Olgun Kaya
0

Tal vez no esté relacionado con la pregunta, pero necesitaba usar CST, establecer la zona horaria del sistema en la tz deseada (América / ...) y luego en postgresql conf establecer el valor de la zona horaria en 'localtime' y funcionó como un encanto , current_time imprimiendo el momento adecuado (Postgresql 9.5 en Ubuntu 16)

MGrillo
fuente