2014-04-08 9 views
5

RethinkDB एक अद्भुत और बहुत आसान NoSQL डेटाबेस इंजन है। मैं पायथन डेटाटाइम ऑब्जेक्ट्स डालने का सबसे अच्छा तरीका ढूंढ रहा हूं। RethinkDB यूटीसी टाइमस्टैम्प strores, तो मुझे अपने डेटाटाइम ऑब्जेक्ट को सही प्रारूप में बदलने का एक समाधान मिला।रीथिंकडब में पायथन डेटाटाइम डालने का सबसे अच्छा तरीका क्या है?

मैं somethink RethinkDB में मेरे datetime वस्तु कन्वर्ट करने के लिए इस से थोड़ा समारोह का उपयोग समझ में:

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

मेरे वर्तमान समय क्षेत्र सीईटी (GMT + 2 घंटे) इस rethinkdb में मेरी दिनांक के भंडारण के लिए एक अच्छा समाधान है है या एक बेहतर समाधान मौजूद है?

आपकी मदद

+2

मुझे लगता है कि आप डेटाबेस में गलत समय भंडारण कर रहे हैं। रेखा 'dt = datetime.strptime (मेटा ['प्रकाशित_एट'], '% वाई-% एम-% डी% एच:% एम') 'परिणामस्वरूप एक डाटाटाइम ऑब्जेक्ट होगा जो टाइमज़ोन बेवकूफ है क्योंकि आपने निर्दिष्ट नहीं किया है टाइमज़ोन कहीं भी। क्या यह सीईटी में है? क्या यह यूटीसी में है? इस अस्पष्टता को देखते हुए, 'dt.utctimetuple() 'वापस लौटने वाला क्या है? यदि आप टाइमज़ोन से निपट रहे हैं, तो हमेशा टाइमज़ोन जागरूक डेटाटाइम ऑब्जेक्ट्स के साथ काम करना सबसे अच्छा है। अधिक जानकारी के लिए, उपरोक्त टिप्पणी के लिए [pytz] (http://pytz.sourceforge.net) – CadentOrange

+0

+1 पर एक नज़र डालें - हमेशा अपने डेटाटाइम्स को प्रारूप में संग्रहीत करें जो टाइमज़ोन जानकारी संरक्षित है। यहां तक ​​कि यदि आप बहुआयामी डेटा सेट डेलाइट सेविंग टाइम सेट के साथ काम नहीं कर रहे हैं तो समस्याएं हो सकती हैं। –

+0

धन्यवाद, अब मैं डेटाटाइम में टाइमज़ोन के महत्व को समझता हूं। – k3z

उत्तर

5

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

मेरे लिए यह सबसे अच्छा समाधान प्रतीत होता है। मुझे एहसास है कि मैं उन्हें टाइमस्टैम्प में बदलने और सही समय क्षेत्र रखने के बजाय मूल डेटाटाइम ऑब्जेक्ट्स का उपयोग कर सकता हूं। pytz अद्भुत लग रहा है – k3z

1

dt.utctimetuple(), UTC समयज़ोन अर्थात करने के लिए एक अनुभवहीन dt परिवर्तित नहीं करता है, तो published_at यह गलत परिणाम देता है यूटीसी में नहीं है पहले से ही तो के लिए धन्यवाद।

हैं published_at स्थानीय समय क्षेत्र में है और इसलिए dt स्थानीय समय क्षेत्र में है:

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

इस समाधान के लिए धन्यवाद। – k3z

संबंधित मुद्दे