我的服务器在中央时间.我想使用东部时间呈现时间戳.

例如,我想将2012-05-29 15:00:00渲染为2012-05-29 16:00:00 EDT.

我怎样才能做到呢?

to_char('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')表示2012-05-29 16:00:00(无区域).

to_char('2012-05-29 15:00:00'::timestamp at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')等于2012-05-29 14:00:00 CDT(错).

这一个有效,但它是如此的复杂,必须有一个更简单的方法:replace(replace(to_char(('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT')::timestamptz, 'YYYY-MM-DD HH24:MI:SS TZ'), 'CST', 'EST'), 'CDT', 'EDT')

推荐答案

关键是在交易期间将本地时区切换到所需的显示时区:

begin;
set local timezone to 'EST5EDT';
select to_char('2012-05-29 15:00:00'::timestamp at time zone 'CDT',
  'YYYY-MM-DD HH24:MI:SS TZ');
end;

结果是:

2012-05-29美国东部时间16:00:00

请注意,对于set [local] timezone,需要使用完整的时区名称,而不是缩写(例如,CST不起作用).在pg_timezone_names视图中查找有效选项.

要在类似于To_char()调用的上下文中使用该方法,我相信这个函数可以完成以下任务:

CREATE FUNCTION display_in_other_tz(
      in_t timestamptz,
      in_tzname text,
      in_fmt text) RETURNS text
AS $$
DECLARE
 v text;
 save_tz text;
BEGIN
  SHOW timezone into save_tz;
  EXECUTE 'SET local timezone to ' || quote_literal(in_tzname);
  SELECT to_char(in_t, in_fmt) INTO v;
  EXECUTE 'SET local timezone to ' || quote_literal(save_tz);
  RETURN v;
END;
$$ language plpgsql;

Postgresql相关问答推荐

如何在postgres中测试锁定

Gorm 创建表单数据文件上传错误

postgres hierarchy - 用祖先的值填充缺失值

如何在不同的行中显示两列,避免重复并省略空条目

如何在plpgsql中找到一行中的最大值?

从 Postgres 字段中的多个值中进行 Select

在 PostgreSQL 中返回插入的行

整数除法返回 0

将 PostgreSQL 配置为仅适用于 LOCALHOST 或指定的 ip + 端口

在函数中返回字段作为插入结果

PostgreSQL如何连接间隔值'2天'

在 PL/pgSQL 中声明行类型变量

无法安装 psycopg2 Ubuntu

在 Windows 10 中执行时,Docker 容器关闭并给出data directory has wrong ownership错误

为 postgresql 存储过程设置隔离级别

如何将表的一列复制到PostgreSQL中比较相同ID的另一表的列

PostgreSQL:如何在用户级别设置 search_path?

在 Windows 7 上更改/重置 postgresql 用户密码

Postgresql 用随机值更新每一行

PostgreSQL:如何解决numeric field overflow问题