Как конвертировать временные метки Evernote API в временные метки Postgresql

Я получаю доступ к API Evernote через драгоценный камень evernote для ruby ​​on rails и сохраняю объекты (блокноты, теги, заметки и т. д.) в базе данных Postgresql.

Evernote возвращает метки времени, которые выглядят следующим образом:

  • 1344141917000
  • 1344141967000
  • 1344138641000

В документации API Evernote указано, что это количество миллисекунд, прошедших с момента базовое время 1 января 1970 г., 00:00:00 по Гринвичу

Я провел следующее упражнение в консоли рельсов, пытаясь восстановить дату.

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

Я что-то упустил здесь? Что делать с этими последними тремя нулями? Придется ли мне анализировать и нарезать значения timstamp evernote, а затем добавлять их в базу 1970 года, или есть более простой способ?

Кроме того, какой тип данных Postgresql лучше всего подходит для хранения этих значений?

Заранее спасибо за вашу помощь.


person s2t2    schedule 05.08.2012    source источник


Ответы (2)


Для этого в Ruby используйте Time.at. Вам нужно будет разделить на 1000, поскольку временные метки Evernote указаны в миллисекундах, а временные метки Ruby/Unix — в секундах.

createdNote = noteStore.createNote(authToken, note)
createTime = Time.at(createdNote.created / 1000);
puts "Note was created at #{createTime}"
person Seth    schedule 06.08.2012
comment
Это более точно ответило на мой вопрос и пришло к решению без необходимости в переменной evernote_timestamp_base. Спасибо @Сет. - person s2t2; 07.08.2012

В postgresql вы можете использовать временную метку [с | без] часового пояса в качестве типа для столбца.

Временная метка unix определяется как количество секунд с 1 января 1970 года, 00:00:00 по Гринвичу, что Ruby и многие другие системы используют или поддерживают. PostgreSQL может сделать преобразование для вас. Просто передайте значение в секундах функции to_timestamp.

SELECT to_timestamp(1344138641000/1000.0)

Чтобы преобразовать его обратно, используйте

SELECT EXTRACT(EPOCH FROM col)
person Eelke    schedule 05.08.2012
comment
Спасибо, что помогли мне понять, что я могу рассматривать это значение как число (деленное на 1000), а не как текст (который мне пришлось бы анализировать). Это немного упрощает решение. - person s2t2; 05.08.2012