Как да конвертирате Evernote API Timestamps в Postgresql Timestamps

Имам достъп до API на Evernote чрез evernote gem за ruby ​​on rails и съхранявам обектите (тетрадки, тагове, бележки и т.н.) в база данни на Postgresql.

Evernote връща времеви отпечатъци, които изглеждат така:

  • 1344141917000
  • 1344141967000
  • 1344138641000

В документацията за API на evernote се казва, че това е броят милисекунди, изминали от базовото време на 1 януари 1970 г., 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 за съхраняване на тези стойности?

Благодаря ви предварително за помощта.


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. Благодаря @Seth. - person s2t2; 07.08.2012

В postgresql можете да използвате клеймо [с|без] часова зона като тип за колоната.

Unix timestamp се дефинира като броя секунди от 1 януари 1970 г., 00:00:00 GMT, което 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