如何在给定的时区将时间戳字段转换为ISO 8601字符串?[英] How to convert timestamp field to ISO 8601 string in a given time zone?

本文是小编为大家收集整理的关于如何在给定的时区将时间戳字段转换为ISO 8601字符串?的处理方法,想解了如何在给定的时区将时间戳字段转换为ISO 8601字符串?的问题怎么解决?如何在给定的时区将时间戳字段转换为ISO 8601字符串?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在表格中有一个"带时区的时间戳"字段.
我需要返回给定时区中的 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.

谢谢你,

推荐答案

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

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),指定 precision(默认情况下,它将以微秒为单位,而 3 将仅保持毫秒).或者,您可以使用 res := to_char(ts::timestamptz, 'IYYY-MM-DDT HH24:MI:SS:MSOF'); 代替 ::timestamptz(3)::text 转换链,在这种情况下,将不需要 (3).

本文地址:https://www.itbaoku.cn/post/1764042.html