如何查找当前时区 EST 或 EDT

Posted

技术标签:

【中文标题】如何查找当前时区 EST 或 EDT【英文标题】:How to find current timezone EST or EDT 【发布时间】:2019-04-25 03:45:05 【问题描述】:

Postgresql...如何找到当前时区 EST 或 EDT,我正在做但是期待一个适用于所有时区的简单解决方案。,

确切要求:如果我将 ET 作为本地时区,我需要当前时区和日光。

SELECT 
(CASE WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/New_York') - CURRENT_TIMESTAMP = '-04:00:00') then 'EDT' 
WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/New_York') - CURRENT_TIMESTAMP = '-05:00:00') then 'EST' 
ELSE ('OTH') END)

以下是我为此目的使用的功能:

CREATE OR REPLACE FUNCTION public.time_zone_tz_abbriv (
  abbriv text
)
RETURNS text AS
$body$
SELECT
CASE WHEN 'ET' = $1 THEN (CASE WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/New_York') - CURRENT_TIMESTAMP) = '04:00:00' then 'EDT' 
                               WHEN (CURRENT_TIMESTAMP - (CURRENT_TIMESTAMP AT TIME ZONE 'America/New_York')) = '05:00:00' then 'EST' END)
WHEN 'MT' = $1 THEN (CASE WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/Edmonton') - CURRENT_TIMESTAMP) = '06:00:00' then 'MDT' 
                          WHEN (CURRENT_TIMESTAMP - (CURRENT_TIMESTAMP AT TIME ZONE 'America/Edmonton')) = '07:00:00' then 'MST' END)
WHEN 'PT' = $1 THEN (CASE WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/Los_Angeles') - CURRENT_TIMESTAMP) = '07:00:00' then 'PDT' 
                          WHEN (CURRENT_TIMESTAMP - (CURRENT_TIMESTAMP AT TIME ZONE 'America/Los_Angeles')) = '08:00:00' then 'PST' END)
WHEN 'CT' = $1 THEN (CASE WHEN ((CURRENT_TIMESTAMP AT TIME ZONE 'America/Mexico_City') - CURRENT_TIMESTAMP) = '05:00:00' then 'CDT' 
                          WHEN (CURRENT_TIMESTAMP - (CURRENT_TIMESTAMP AT TIME ZONE 'America/Mexico_City')) = '06:00:00' then 'CST' END)
END
$body$
LANGUAGE 'sql'
IMMUTABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100;

以下是用法

SELECT TIME_ZONE_TZ_ABBRIV('ET');
Ans: EST or EDT
SELECT TIME_ZONE_TZ_ABBRIV('PT');
Ans: PST or PDT
SELECT TIME_ZONE_TZ_ABBRIV('MT');
Ans: MST or MDT
SELECT TIME_ZONE_TZ_ABBRIV('CT');
Ans: CST or CDT

【问题讨论】:

【参考方案1】:

只要您的要求确实是时区EDT/ESTMDT/MST当前时间戳,您可以使用pg_timezone_names。 它应该始终根据您的系统时钟返回正确的缩写。

例子:

SELECT *
FROM pg_timezone_names
WHERE Name IN ('America/Edmonton','America/New_York')

此外,无论日期如何,所有缩写都在 pg_timezone_abbrevs

例子:

SELECT *
from pg_timezone_abbrevs
WHERE Abbrev in ('EST','EDT')

【讨论】:

它会在夏令时自动更改吗..? 是的:我的笔记本电脑上的 postgresql 11 甚至不需要重新启动来更改结果。我不知道它是否取决于 ini 文件中的参数,所以如果您可以更改服务器的日期,我建议您尝试一下。

以上是关于如何查找当前时区 EST 或 EDT的主要内容,如果未能解决你的问题,请参考以下文章

修改linux系统的时间EDT和EST为CST

时区时间戳怪异

更改 MySQL 中的连接时区

linux CST与EDT时区互转

linux CST与EDT时区互转

如何使用纯函数可靠地将 POSIX 纪元秒转换为 EST/EDT 时间