postgresql:带时区的数字到时间戳问题

时间:2014-10-25 16:35:11

标签: postgresql timezone timestamp

我已经从gmail中将一些电子邮件提取到postgresql中。日期以数字形式存储。一些样本日期

1399586523000
1399773692000
1400191333000
1400378501000
1400796072000
1401008483000
1401400912000
1401588106000

当我将它们转换为时间戳

to_timestamp(date/1000) at time zone 'UTC+10' as senttimestamp

问题是时区匹配和电子邮件中的分钟部分都不匹配。我可以轻松地向前或向后移动时区来调整,但日期的分钟部分也不匹配。我怀疑可能是我错误地从数字转换到时间戳

例如,1399586523000时间戳应该是2014年5月8日星期四下午4:21,但是当我使用

to_timestamp(date/1000) at time zone 'UTC+10' as senttimestamp

转换的时间戳都不匹配实际发送的时间戳

有人可以帮忙吗

阿里夫

1 个答案:

答案 0 :(得分:1)

  

例如,1399586523000时间戳应该是2014年5月8日星期四   下午4:21

假设自1970年1月1日以来的UTC时间戳以毫秒为单位,预期结果不正确,并且PostgreSQL的结果是正确的。

以下是Perl的本地时间:

$ LANG=C TZ=GMT 
 perl -e 'use POSIX; print strftime("%c", localtime(1399586523));'

结果: 2014年5月8日星期二22:02:03

$ LANG=C TZ=UTC+10
  perl -e 'use POSIX; print strftime("%c", localtime(1399586523));'

结果: 2014年5月8日星期四12:02:03

的PostgreSQL:

=> select to_timestamp(1399586523) at time zone 'UTC+10';
      timezone       
---------------------
 2014-05-08 12:02:03
(1 row)

邮件消息中的日期用RFC-822 format表示,而不是用Unix时间戳表示,所以你的时间戳是如何获得的以及它们的确切代码并不明显。