首页 > 解决方案 > 将十六进制转换为日期格式 utc-5 Postgresql

问题描述

你好朋友我正在尝试将十六进制转换为必须为 utc-5 格式秘鲁时间的日期

这是我尝试进行此转换的功能:

CREATE OR REPLACE FUNCTION public.hex_timestamp(
    text)
    RETURNS timestamp without time zone
    LANGUAGE 'sql'

    COST 100
    IMMUTABLE STRICT 
    
AS $BODY$
select 
    (to_timestamp(('x' || lpad($1, 16, '0'))::bit(64)::bigint / 1000.0))::timestamptz at time zone 'utc-5'
$BODY$;

ALTER FUNCTION public.hex_timestamp(text)
    OWNER TO postgres;

这是我的十六进制值:

0000017B3DB65648

但是,时间不正确,因为我比当前日期提前一天,而且时间也不正确

13/08/2021 04:12:45

我想让你告诉我正确的日期和时间以及秘鲁时间,这是它应该显示的正确时间

12/08/2021 23:23:53

感谢您的帮助

标签: postgresqlplpgsql

解决方案


您似乎正在使用我从这个相关答案中的十六进制到十进制转换:

这会将十六进制转换0000017B3DB65648为十进制1628827965000

SELECT ('x' || lpad('0000017B3DB65648', 16, '0'))::bit(64)::bigint;  -- 1628827965000

该数字似乎代表自 Postgres 时代 (2000-01-01 00:00:00) 以来的毫秒数。看:

SELECT to_timestamp(1628827965000 / 1000) AT TIME ZONE 'UTC';         -- '2021-08-13 06:12:45'
     , extract('epoch' FROM timestamp '2021-08-13 04:12:45') * 1000;  -- 1628827965000

您想要的结果是2021-08-13 23:23:53,这恰好是19:11:08稍后的时间间隔(19 小时,11 分钟,8 秒)。
那是毫秒,和 69068000之间的差异。16288970330001628827965000

似乎没有任何意义。通过调整时区,我们无法达到您想要的结果。

请检查您的问题是否有错别字,并告诉我们十六进制数字应该准确代表什么


推荐阅读