web-dev-qa-db-fra.com

Comment obtenir le nom du fuseau horaire actuel dans Postgres 9.3?

Je veux obtenir le nom du fuseau horaire actuel. Ce que j’ai déjà accompli, c’est d’obtenir l’abréviation utc_offset/the timezone via:

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

Cela me donne toutes les combinaisons Continent/Capital pour ce fuseau horaire, mais pas le fuseau horaire exact. Par exemple je reçois:

Europe/Amsterdam
Europe/Berlin

Le serveur est à Berlin et je veux obtenir le nom du fuseau horaire du serveur.

Le problème que j'ai avec CET est qu'il est toujours UTC + 01: 00 et ne tient pas compte de DST iirc.

53
Deutro

Je ne pense pas que cela soit possible en utilisant PostgreSQL seul dans le cas le plus général. Lorsque vous installez PostgreSQL, vous choisissez un fuseau horaire. Je suis presque sûr que le comportement par défaut consiste à utiliser le fuseau horaire du système d'exploitation. Cela sera généralement reflété dans postgresql.conf en tant que valeur du paramètre "timezone". Mais la valeur se termine par "localtime". Vous pouvez voir ce paramètre avec l'instruction SQL.

show timezone;

Mais si vous changez le fuseau horaire dans postgresql.conf en quelque chose comme "Europe/Berlin", alors show timezone; retournera cela valeur au lieu de "heure locale".

Je pense donc que votre solution impliquera de définir "timezone" dans postgresql.conf sur une valeur explicite plutôt que sur la valeur par défaut "localtime".

Cela peut vous aider ou non à résoudre votre problème, OP, mais pour obtenir le fuseau horaire du serveur actuel par rapport à UTC ( T1 , techniquement), procédez comme suit:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

Ce qui précède fonctionne en extrayant le décalage relatif UT1 en minutes, puis en le convertissant en heures en utilisant le facteur de 3600 secondes/heure.

Exemple:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)

( docs ).

16
koyae

Voir cette réponse: Source

Si le fuseau horaire n'est pas spécifié dans postgresql.conf ou en tant qu'option de ligne de commande du serveur, le serveur tente d'utiliser la valeur de la variable d'environnement TZ comme fuseau horaire par défaut. Si TZ n'est pas défini ou ne correspond à aucun des noms de fuseau horaire connus de PostgreSQL, le serveur tente de déterminer le fuseau horaire par défaut du système d'exploitation en vérifiant le comportement de la fonction de bibliothèque C localtime (). Le fuseau horaire par défaut est sélectionné comme correspondance la plus proche parmi les fuseaux horaires connus de PostgreSQL. (Ces règles permettent également de choisir la valeur par défaut de log_timezone, si elle n'est pas spécifiée.) source

Cela signifie que si vous ne définissez pas de fuseau horaire, le serveur tente de déterminer le fuseau horaire par défaut du système d'exploitation en vérifiant le comportement de la fonction de bibliothèque C localtime ().

Si le fuseau horaire n'est pas spécifié dans postgresql.conf ou en tant qu'option de ligne de commande du serveur, le serveur tente d'utiliser la valeur de la variable d'environnement TZ comme fuseau horaire par défaut.

Il semble que le fuseau horaire du système soit défini est possible.

Obtenez le fuseau horaire local du SE à partir du shell. En psql:

=> \! date +%Z
7
Igoranze

Cela semble fonctionner correctement dans Postgresql 9.5:

SELECT current_setting('TIMEZONE');
5
KotGaf