【问题标题】:How to convert timestamp field to ISO 8601 string in a given time zone? [duplicate]如何在给定时区将时间戳字段转换为 ISO 8601 字符串? [复制]
【发布时间】:2017-12-16 08:33:42
【问题描述】:

我在表格中有一个“带时区的时间戳”字段。
我需要返回给定时区中的 iso 8601 字符串。
我设法做的最接近的事情是:

select to_char(crtdate, 'YYYY-MM-DD"T"HH24:MI:SS.MSOF:"00"')  from t1

但它会返回系统默认时区 (UTC) 中的时间戳,例如:

2017-07-12T02:46:26.194+00:00

虽然我需要将其格式化为特定时区。
例如。

2017-07-12T14:46:26.194+12:00

代表“太平洋/奥克兰”。

有人可以告诉我如何实现吗?

我们正在使用 PG v 9.6。

谢谢你,

【问题讨论】:

  • @a_horse_with_no_name 这将给出 Postgres 格式的时间戳,而不是 ISO 8601
  • 您是否需要获取当前timezone GUC 设置的值(由set timezone = ...; 设置)或者您想要动态(不接触GUC)获取不同时区的ISO8601 值?跨度>
  • @a_horse_with_no_name 内部,没有任何格式,没错,但是有一个默认的输出格式,这就是这里的重点。更重要的是,你的 cmets 导致的不是主题启动者需要的方向——at time zone ... 会给你一个没有任何时区信息的值,而作者需要 ISO 8601,有小时班次(但是,at time zone ... 可以帮助构建适当的自定义函数)
  • 如果你对“有”输出格式有任何疑问——postgresql.org/docs/current/static/…“日期/时间类型的输出格式可以设置为ISO 8601、SQL(Ingres)四种样式之一、传统的 POSTGRES(Unix 日期格式)或德语。”
  • 这可能会有所帮助:stackoverflow.com/q/10797720/330315this

标签: postgresql


【解决方案1】:

您可以在函数中使用 GUC 参数 datestyletimezone 来获得您想要的。这是一个示例(但是,它返回微秒,因此您可能需要稍微调整一下):

create or replace function timestamp_iso8601(ts timestamptz, tz text) returns text as $$
declare
  res text;
begin
  set datestyle = 'ISO';
  perform set_config('timezone', tz, true);
  res := ts::timestamptz(3)::text;
  reset datestyle;
  reset timezone;
  return replace(res, ' ', 'T') || ':00';
end;
$$ language plpgsql volatile;

结果:

test=# select timestamp_iso8601(now()::timestamptz, 'Europe/Moscow');
       timestamp_iso8601
-------------------------------
 2017-07-12T08:56:58.692985+03:00

test=# select timestamp_iso8601(now()::timestamptz, 'Pacific/Auckland');
       timestamp_iso8601
-------------------------------
 2017-07-12T17:59:05.863483+12:00
(1 row)

更新:已编辑。您可以使用timestamptz(3),指定精度(默认情况下,它将以微秒为单位,而3 将只保留毫秒)。或者,您可以使用res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); 代替::timestamptz(3)::text 转换链,在这种情况下将不需要(3)

【讨论】:

  • 不正确地将时区偏移分钟附加为|| ':00'。这种方法没有考虑到像斯里兰卡这样的地方,偏移量是 UTC+05:30。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2021-01-19
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多