2014-04-08 10 views
5

RethinkDB ist eine wunderbare und sehr praktische NoSQL-Datenbank-Engine. Ich suche nach der besten Möglichkeit, Python-Datetime-Objekte einzufügen. RethinkDB streut UTC-Zeitstempel, also habe ich eine Lösung gefunden, um mein Datetime-Objekt in das richtige Format zu konvertieren.Was ist der beste Weg, Python Datetime in rethinkdb einzufügen?

Ich benutze diese litle Funktion meines Datetime-Objekt in some RethinkDB verstehen zu konvertieren:

import calendar 
from datetime import datetime 
import rethinkdb as r 


def datetime_to_epoch_time(dt): 
    timestamp = calendar.timegm(dt.utctimetuple()) 
    return r.epoch_time(timestamp) 

title = u'foobar' 
published_at = '2014-03-17 14:00' 

# firts I convert 2014-03-17 14:00 to datetime 
dt = datetime.strptime(published_at, '%Y-%m-%d %H:%M') 

# then I store the result 
r.table('stories').insert({ 
    'title': title, 
    'published_at': datetime_to_epoch_time(dt), 
}).run() 

Meine aktuelle Zeitzone CET (GMT + 2 Stunden) Ist das eine gute Lösung meiner Daten in rethinkdb zum Speichern oder eine bessere Lösung existiert?

Danke für Ihre Hilfe

+2

Ich vermute, dass Sie die falsche Zeit in der Datenbank sind zu speichern. Die Zeile 'dt = datetime.strptime (meta ['published_at'], '% Y-% m-% d% H:% M') führt zu einem Datum/Uhrzeit-Objekt, das keine Zeitzone ist, da Sie das nicht angegeben haben Zeitzone überall. Ist es in CET? Ist es in UTC? Was wird 'dt.utctimetuple()' angesichts dieser Ambiguität zurückgeben? Wenn Sie mit Zeitzonen arbeiten, ist es am besten, immer mit zeitzonenbewussten Datetime-Objekten zu arbeiten. Für weitere Details, werfen Sie einen Blick auf [pytz] (http://pytz.sourceforge.net) – CadentOrange

+0

+1 für den obigen Kommentar - immer speichern Sie Ihre Datumsangaben in einem Format die Zeitzone Informationen erhalten bleibt. Selbst wenn Sie nicht mit Mehrländerdatensätzen arbeiten, kann Sommerzeit zu Problemen führen. –

+0

Danke, jetzt verstehe ich die Bedeutung der Zeitzone in Datetime. – k3z

Antwort

5

Ein Beispiel mit pytz:

from datetime import datetime 
import pytz 

import rethinkdb as r 


# Init 
r.connect('localhost', 28015).repl() 
if 'test' in r.db_list().run(): 
    r.db_drop('test').run() 

r.db_create('test').run() 
r.db('test').table_create('stories').run() 

paris = pytz.timezone('Europe/Paris') 

r.table('stories').insert({ 
    'title': u'Foobar', 
    'published_at': paris.localize(datetime.strptime(
     '2014-03-17 14:00', '%Y-%m-%d %H:%M' 
    ), is_dst=False) 
}).run() 

for document in r.table("stories").run(): 
    print(document['published_at']) 
    print(type(document['published_at'])) 
+0

Für mich scheint dies die beste Lösung zu sein. Ich weiß, dass ich native datetime-Objekte verwenden kann, anstatt sie in Zeitstempel umzuwandeln und die richtige Zeitzone beizubehalten. Pytz sieht fantastisch aus – k3z

1

dt.utctimetuple() ist ein naives dt zu UTC-Zeitzone das heißt nicht konvertieren, wenn published_at nicht in UTC ist bereits dann das falsche Ergebnis zurück.

Wenn published_at in lokaler Zeitzone und daher ist dt in lokaler Zeitzone:

from datetime import datetime 
import pytz # $ pip install pytz 
from tzlocal import get_localzone # $ pip install tzlocal 

tz = get_localzone() 
aware_dt = tz.localize(dt, is_dst=None) 
timestamp = (aware_dt - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() 
# ... r.epoch_time(timestamp) 
+0

Vielen Dank für diese Lösung. – k3z

Verwandte Themen