纪元转换关闭 1 秒

epoch conversion off by 1 second

select from_tz(
         cast(
           to_date('1970-01-01 00','yyyy-mm-dd hh24')
             + (1536698971759)/1000/60/60/24
           as timestamp
         ),
         'GMT'
       ) at time zone 'US/Eastern'
from   dual;

产量:

11-SEP-18 04.49.32.000000 PM US/EASTERN

然而,如果您将 1536698971759 插入任何在线转换器,您将看到秒数实际上是 31,而不是 32

怎么了?

这是隐式舍入的问题。 DATE 数据类型(由于 TO_DATE())不支持小数秒,因此 31.759 四舍五入为 32。

试试这个:

SELECT
   (TIMESTAMP '1970-01-01 00:00:00 UTC' + 1536698971759/1000 * INTERVAL '1' SECOND) AT TIME ZONE 'US/Eastern'
FROM dual;

(TIMESTAMP '1970-01-01 00:00:00 UTC' + NUMTODSINTERVAL(1536698971759/1000, 'SECOND')) AT TIME ZONE 'US/Eastern'如果你愿意

yields: 11.09.2018 16:49:31.759000000 -04:00