में वापस लेना मैं राष्ट्रीय मौसम सेवा अलर्ट को वेब एप्लिकेशन में फ़ीड कर रहा हूं। जब वे अपने समाप्ति समय को दबाते हैं तो मैं अलर्ट को शुद्ध करना चाहता हूं। मैं उन भौगोलिक क्षेत्र के लिए स्थानीय समय प्रारूप में समाप्ति समय भी प्रदर्शित करना चाहता हूं जो वे संबंधित हैं।यूटीसी को टाइमज़ोन-जागरूक दिनांक स्ट्रिंग को परिवर्तित करना और पाइथन
अलर्ट पूरे अमेरिका को कवर करते हैं, इसलिए मुझे लगता है कि यूटीसी टाइमस्टैम्प में समय को स्टोर और तुलना करना सबसे अच्छा तरीका है। समाप्ति समय फ़ीड में इस तरह की स्ट्रिंग के रूप में आता है: 2011-09-09T22:12:00-04:00
।
मैं Labix dateutils पैकेज का उपयोग कर रहा एक समय क्षेत्र अवगत ढंग से स्ट्रिंग पार्स करने में:
>>> from dateutil.parser import parse
>>> d = parse("2011-09-18T15:52:00-04:00")
>>> d
datetime.datetime(2011, 9, 18, 15, 52, tzinfo=tzoffset(None, -14400))
मैं भी यूटीसी घंटे में ऑफसेट को पकड़ने में सक्षम हूँ:
>>> offset_hours = (d.utcoffset().days * 86400 + d.utcoffset().seconds)/3600
>>> offset_hours
-4
:
datetime.utctimetuple()
और time.mktime()
तरीकों का उपयोग करना, मैं एक यूटीसी टाइमस्टैम्प पर पार्स तारीख बदलने में सक्षम हूँ
इस बिंदु पर, मुझे बहुत अच्छा लगता है कि मैं कच्चे तारों को यूटीसी में समाप्ति समय का प्रतिनिधित्व करने वाले टाइमस्टैम्प में परिवर्तित करने में सक्षम हूं।
>>> now_utc_ts = time.mktime(time.gmtime())
>>> now_utc_ts
1316398744.0
>>> now_utc_ts >= expiration_tc_ts
True
कठिनाई मैं हो रही है मेरी संग्रहीत यूटीसी टाइमस्टैम्प मूल करने के लिए वापस परिवर्तित करने के लिए कोशिश कर रहा है: मैं अगर यह साफ़ कर दिया की जरूरत समाप्ति के लिए एक यूटीसी टाइमस्टैम्प के रूप में वर्तमान समय की तुलना करने और निर्धारित करने में सक्षम हूँ स्थानीय प्रारूप। मैं मूल रूपांतरण और एक स्ट्रिंग से संग्रहीत ऑफसेट घंटे मैं समय क्षेत्र लेबल स्टोर करने के लिए पार्स है:
>>> print offset_hours
-4
>>> print timezone
EDT
मैं यूटीसी टाइमस्टैम्प एक स्थानीय रूप से स्वरूपित समय के लिए वापस रूपांतरित करना चाहते हैं, लेकिन यह करने के लिए परिवर्तित करने के लिए वापस एक datetime
काम नहीं लगता है:
>>> import datetime
>>> datetime.datetime.fromtimestamp(expiration_utc_ts) + datetime.timedelta(hours=offset_hours)
datetime.datetime(2011, 9, 18, 16, 52) # The hour is 16 but it should be 15
ऐसा लगता है कि यह एक घंटे से बंद है की तरह। मुझे यकीन नहीं है कि त्रुटि कहां पेश की गई थी? मैंने एक और परीक्षण एक साथ रखा और इसी तरह के परिणाम मिल गए:
>>> # Running this at 21:29pm EDT
>>> utc_now = datetime.datetime.utcnow()
>>> utc_now_ts = time.mktime(right_now.utctimetuple())
>>> datetime.datetime.fromtimestamp(utc_now_ts)
datetime.datetime(2011, 9, 18, 22, 29, 47) # Off by 1 hour
क्या कोई मेरी गलती ढूंढने में मेरी सहायता कर सकता है? मुझे यकीन नहीं है कि यह डेलाइट बचत मुद्दा है या नहीं? मैं कुछ सामानों में आया जो मुझे विश्वास दिलाता है कि यह मेरी तिथियों और समय को स्थानीयकृत करने की कोशिश कर रहा है लेकिन इस बिंदु पर मैं काफी स्टंप हूं। मैं समय-समय पर अज्ञात तरीके से इन सभी गणनाओं/तुलनाओं को करने की उम्मीद कर रहा था।
[स्थानीय समय क्षेत्र से यूटीसी में कनवर्ट कर फिर वापस अजगर/pytz साथ जारी करना] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/7465181/issue-with-python-pytz-converting- स्थानीय-टाइमज़ोन-टू-यूटीसी-बैक-बैक) – agf
मैंने सोचा होगा कि आप यह सब डेटाटाइम ऑब्जेक्ट्स के साथ कर सकते हैं, और टुपल्स या टाइमस्टैम्प में कनवर्ट नहीं कर सकते हैं। यदि आप टाइमज़ोन-जागरूक "अब" डेटाटाइम ऑब्जेक्ट बनाते हैं तो बस "अगर x
मुझे आशा है कि, लेकिन PostgreSQL डेटाटाइम वैल्यू को स्थानीयकृत करना चाहता था। (मुझे यकीन है कि इसके चारों ओर एक रास्ता है, लेकिन मुझे लगा कि यूटीसी टाइमस्टैम्प स्टोर करने के लिए अभी यह आसान होगा) – Scott