3

我正在通过用于 ruby​​ on rails 的 evernote gem 访问 Evernote API,并将对象(笔记本、标签、笔记等)存储在 Postgresql 数据库中。

Evernote 返回如下所示的时间戳:

  • 1344141917000
  • 1344141967000
  • 1344138641000

evernote api 文档说这是自 1970 年 1 月 1 日 00:00:00 GMT 基准时间以来经过的毫秒数

我在 Rails 控制台中进行了以下练习,试图重建日期。

evernote_timestamp_base = Time.gm(1970,01,01,00,00,00)
=> 1970-01-01 00:00:00 UTC 
evernote_timestamp_base + 1344138641000
=> 44564-01-22 04:43:20 UTC 

绝对不对。但是去掉最后三个零会产生正确的日期:

evernote_timestamp_base + 1344138641
=> 2012-08-05 03:50:41 UTC

我在这里错过了什么吗?最后三个零是怎么回事?我是否必须解析和切分evernote timstamp 值,然后将它们添加到 1970 基数中,还是有更简单的方法?

另外,存储这些值的最佳 Postgresql 数据类型是什么?

在此先感谢您的帮助。

4

2 回答 2

5

在 postgresql 中,您可以使用时间戳 [with|without] 时区作为列的类型。

unix 时间戳定义为自 1970 年 1 月 1 日 00:00:00 GMT 以来的秒数,这是 Ruby 和许多其他系统使用和/或支持的。PostgreSQL 可以为您进行转换。只需以秒为单位将值传递给 to_timestamp 函数。

SELECT to_timestamp(1344138641000/1000.0)

要将其转换回使用

SELECT EXTRACT(EPOCH FROM col)
于 2012-08-05T06:04:52.177 回答
5

要在 Ruby 中执行此操作,请使用 Time.at。您需要除以 1000,因为 Evernote 时间戳以毫秒为单位,而 Ruby/Unix 时间戳以秒为单位。

createdNote = noteStore.createNote(authToken, note)
createTime = Time.at(createdNote.created / 1000);
puts "Note was created at #{createTime}"
于 2012-08-06T17:56:30.713 回答