2012-11-06 6 views
25

मैं फ़ंक्शन की एक जोड़ी लिखने की कोशिश कर रहा हूं, dt और ut, जो सामान्य यूनिक्स समय के बीच आगे और पीछे परिवर्तित होता है 1 9 70-01-01 00:00:00 यूटीसी) और एक पायथन डेटाटाइम ऑब्जेक्ट।एक यूनिटटाइम को डेटाटाइम ऑब्जेक्ट में कनवर्ट करें और फिर से वापस जाएं (समय रूपांतरण फ़ंक्शन जो इनवर्सेज़ हैं)

तो dt और ut उचित प्रतिलोम थे तो इस कोड को दो बार एक ही टाइमस्टैम्प प्रिंट होगा:

import time, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.fromtimestamp(u) 
def ut(d): return time.mktime(d.timetuple()) 

u = 1004260000 
print u, "-->", ut(dt(u)) 

ओह, दूसरा टाइमस्टैम्प 3600 सेकंड (एक घंटे) पहले से कम है। मुझे लगता है कि यह केवल बहुत ही विशिष्ट unixtimes के लिए होता है, शायद उस घड़ी के दौरान कि डेलाइट बचत समय खत्म हो जाता है। लेकिन क्या dt और ut लिखने का कोई तरीका है, इसलिए वे एक-दूसरे के सही उलटे हैं?

संबंधित प्रश्न: Making matplotlib's date2num and num2date perfect inverses

+0

btw, समारोह कुछ नहीं करता है, लेकिन साथ एक और फ़ंक्शन को कॉल करता है, तो वही तर्क तब आप इसे असाइन कर सकते हैं: 'dt = datetime.datetime.utcfromtimestamp'। कार्य पाइथन में प्रथम श्रेणी के नागरिक हैं: आप उन्हें किसी अन्य कार्यों के पैरामीटर के रूप में पास कर सकते हैं, कार्यों से वापस आ सकते हैं, आदि – jfs

+0

आह, अच्छा, बढ़िया बिंदु! क्या ऐसा करना या संक्षेप में मामला करना अधिक कुशल है? 'Def f (x) के बारे में क्या: वापसी foo (x)' बनाम 'f = lambda x: foo (x)'? (मेरी यादें यह है कि वे कार्यात्मक और दक्षता दोनों के बराबर हैं।) – dreeves

+0

'f = g' का अर्थ है कि f, g दो नाम हैं जो एक ही कार्य को संदर्भित करते हैं। 'def' और 'lambda' नया फ़ंक्शन बनाते हैं। – jfs

उत्तर

37

आप सही है कि इस व्यवहार डेलाइट सेविंग टाइम से संबंधित है कर रहे हैं। इससे बचने का सबसे आसान तरीका यह सुनिश्चित करना है कि आप डेलाइट बचत के बिना समय क्षेत्र का उपयोग करें, यूटीसी यहां सबसे अधिक समझ में आता है।

datetime.datetime.utcfromtimestamp() और calendar.timegm() यूटीसी समय के साथ सौदा, और सटीक उलटा हैं।

import calendar, datetime 

# Convert a unix time u to a datetime object d, and vice versa 
def dt(u): return datetime.datetime.utcfromtimestamp(u) 
def ut(d): return calendar.timegm(d.timetuple()) 

यहाँ कारण है कि datetime.datetime.fromtimestamp() डेलाइट सेविंग टाइम के साथ एक समस्या, डॉक्स से है पीछे स्पष्टीकरण का एक सा:

वापसी स्थानीय दिनांक और समय POSIX टाइमस्टैम्प करने के लिए इसी, है जैसे time.time() द्वारा लौटाया गया। यदि वैकल्पिक तर्क tz कोई नहीं है या निर्दिष्ट नहीं है, तो टाइमस्टैम्प को प्लेटफ़ॉर्म की स्थानीय तिथि और समय में परिवर्तित कर दिया जाता है, और लौटाया गया टाइमटाइम ऑब्जेक्ट बेवकूफ़ है।

यहां महत्वपूर्ण बात यह है कि आप एक अनुभवहीन datetime.datetime वस्तु है, जिसका अर्थ वस्तु का एक भाग के रूप में समय ज़ोन नहीं (या डेलाइट सेविंग) जानकारी नहीं है मिलता है। इसका मतलब यह है जब fromtimestamp() का उपयोग कर अधिक अलग-अलग टाइम स्टांप ही datetime.datetime वस्तु को मैप कर सकते हैं, अगर आप बार है कि डेलाइट सेविंग टाइम वापस रोल दौरान गिर लेने के लिए होती हैं:

>>> datetime.datetime.fromtimestamp(1004260000) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
>>> datetime.datetime.fromtimestamp(1004256400) 
datetime.datetime(2001, 10, 28, 1, 6, 40) 
+0

बिल्कुल सही; धन्यवाद! (और मैंने पुष्टि की है कि यह मेरे लिए काम करता है।) – dreeves

+0

['ut = lambda naive_utc_dt: (naive_utc_dt - डेटाटाइम (1 9 81,1,1)) .total_seconds()'] (http://stackoverflow.com/a/ 8778548/4279) – jfs

+0

@JFSebastian, इसे एक उत्तर के रूप में जोड़ना चाहते हैं? ऐसा लगता है कि आप सही हैं (हालांकि मैंने आपका संस्करण सत्यापित नहीं किया है) और आपका यहां स्वीकार्य उत्तर होना चाहिए। मुझे वंश के भटकने से नफरत है, टिप्पणियों में केवल एक लिंक बेहतर तरीके से इंगित करता है! – dreeves

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