【问题标题】:How to convert Evernote API Timestamps to Postgresql Timestamps如何将 Evernote API 时间戳转换为 Postgresql 时间戳
【发布时间】:2012-08-05 05:45:08
【问题描述】:

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

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

  • 1344141917000
  • 1344141967000
  • 1344138641000

evernote api documentation 表示这是自基准时间 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 时间戳值,然后将它们添加到 1970 基数中,还是有更简单的方法?

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

提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails postgresql datetime timestamp evernote


    【解决方案1】:

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

    createdNote = noteStore.createNote(authToken, note)
    createTime = Time.at(createdNote.created / 1000);
    puts "Note was created at #{createTime}"
    

    【讨论】:

    • 这更准确地回答了我的问题,并在不需要 evernote_timestamp_base 变量的情况下得出了解决方案。谢谢@Seth。
    【解决方案2】:

    在 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)
    

    【讨论】:

    • 感谢您帮助我意识到我可以将此值视为一个数字(除以 1000),而不是文本(我必须对其进行解析)。这使得解决方案更容易一些。
    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多