2011-07-12 27 views
35

Instalé PostgreSQL 9 y el tiempo que se muestra es 1 hora detrás de la hora del servidor.postgres zona horaria predeterminada

Operando Select NOW() espectáculos: 2011-07-12 11:51:50.453842+00

Según los datos de servidor: Mar Jul 12 12:51:40 BST 2011

Se encuentra a 1 hora de retraso, pero la zona horaria se muestra en phpPgAdmin es: zona horaria Etc/GMT0

He intentado entrar en el postgresql.conf y configurar timezone = GMT luego ejecutando un reinicio pero sin cambios.

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

¡SOLUCIÓN !: Me puse a GMT antes y estaba una hora detrás ... después de buscar resultó que tenía que configurarlo en Europa/Londres. ¡Esto toma en cuenta el +1 hora en verano británico, GMT no!

Respuesta

42

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

Ver the doc.

set timezone TO 'GMT'; 

O, más estrechamente siguiendo el estándar SQL, utilice el comando SET TIME ZONE. Observe dos palabras para "ZONA HORARIA" donde el código anterior usa una sola palabra "zona horaria".

SET TIME ZONE 'UTC'; 

El documento explica la diferencia:

fijados el huso horario se extiende sintaxis definida en el estándar SQL. El estándar solo permite desplazamientos numéricos de zona horaria, mientras que PostgreSQL permite especificaciones de zona horaria más flexibles. Todas las demás características SET son extensiones de PostgreSQL.

+0

He intentado configurar eso y no parece funcionar, tampoco eso solo lo establece para la sesión activa. Deseo cambiarlo permanentemente para todas las bases de datos, lo hice fácilmente en phpmyadmin pero no puedo encontrar la forma de hacerlo para postgresql –

+0

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 debe cambiar la zona horaria de todas las bases de datos. –

+4

He intentado cambiando la zona horaria a GMT en postgresql.conf y parece estar funcionando bien. –

33

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

1.- Buscar en la carpeta de "zonas horarias" en /usr/share/postgresql/9.1/ para el archivo apropiado, en mi caso sería "America.txt", en él, busque la ubicación más cercana a su zona y copie las primeras letras en la columna de la izquierda.

Por ejemplo: si se encuentra 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.- comentario en la línea "zona horaria" en su archivo y poner postgresql.conf 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.- Restart Postgres

+1

Esta es la respuesta correcta, ya que hace que el TZ cambie de forma predeterminada para cada proceso en PGSQL, no solo para el usuario actual. – jfreak53

+10

Sugiero que ** evite esos códigos de 3 o 4 letras ** por completo. No están estandarizados ni son únicos. En su lugar, use [nombres de zona horaria adecuados] (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (continente SLASH ciudad o región). Para usar su propio ejemplo, Panamá usa un desplazamiento de '-05: 00' durante todo el año, mientras que Nueva York cambia una hora con horario de verano (DST). Una zona horaria es más que un desplazamiento; un huso horario incluye el conjunto de reglas y anomalías pasadas, presentes y futuras, como DST. Entonces, diga lo que quiere decir: 'América/Panamá',' América/Nuevo_York', 'Europa/Londres',' UTC' (o 'Zulu'). –

+0

Según [PostGRE docs] (http://www.postgresql.org/docs/9.1/static/datatype-datetime.html#DATATYPE-TIMEZONES), puede consultar una vista interna para obtener una lista de la zona horaria reconocida nombres en su base de datos específica haciendo '' 'SELECT * FROM pg_timezone_names''' que probablemente sea más seguro de hacer, dado que los sitios de terceros no necesariamente estarán tan actualizados (o desactualizados) como su propia instancia de base de datos particular. – SeldomNeedy

13

El accepted answer por Muhammad Usama es correcto.

de configuración de parámetros Nombre

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

SET timezone TO 'UTC'; 

... donde timezone no es un comando SQL, es el nombre de la configuración parámetro.

Ver the doc for this.

de comandos 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 ZONE reemplaza a "zona horaria" (comando SQL real frente a nombre de parámetro), y no hay "TO".

SET TIME ZONE 'UTC'; 

Tanto este comando como el anterior tienen el mismo efecto, para establecer el valor de la sesión actual solamente. Para hacer que el cambio sea permanente, consulte este sibling answer.

Ver the doc for this.

Nombre de zona horaria

Se puede especificar un proper time zone name. La mayoría de estos son continente/región.

SET TIME ZONE 'Africa/Casablanca'; 

... o ...

SET TIME ZONE 'America/Montreal'; 

Evitar la carta de 3 o 4 abreviaturas como EST o IST ya que no están normalizados ni único.

Get zona actual

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

SHOW timezone ; 

... o ...

SHOW time zone ; 

de Estados Unidos/Pacífico

+0

punto de bonificación por ser la única respuesta para proporcionar la parte' SHOW' –

17

Elige una zona horaria a partir de:

SELECT * FROM pg_timezone_names; 

Y pusieron ejemplo:

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

Use su nombre de base de datos.

+0

Debe reiniciar el servicio postgresql una vez hecho esto –

+6

@JoeyPinto no es cierto, es suficiente para emitir 'SELECT pg_reload_conf();' :) – Alphaaa

7

Además de las respuestas anteriores, si se utiliza la herramienta pgAdmin III se puede establecer la zona horaria de la siguiente manera:

  1. abierto PostgreSQL de configuración a través de Herramientas> Configuración del servidor> postgresql.conf
  2. Look para la entrada zona horaria y haga doble clic para abrir
  3. cambiar el valor
  4. recarga del servidor para aplicar los cambios de configuración (Play, pero ton en los servicios superiores o vía)

Postgres config in pgAdmin III

0

Nota muchos clientes de terceros tienen una configuración de zona horaria propios superpuestas cualquier servidor Postgres y \ o de sesión de configuración.

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

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

de lo contrario verá "UTC" a pesar de lo que haya configurado en otro lugar.

0

Quizás no esté relacionado con la pregunta, pero necesitaba usar CST, establecer la zona horaria del sistema en el tz deseado (America/...) y luego en postgresql conf establecer el valor de la zona horaria en 'localtime' y funcionó como un encanto, current_time imprimió el tiempo correcto (Postgresql 9.5 en Ubuntu 16)

Cuestiones relacionadas