पायथन में असंगत डेटाटाइम पार्स समयक्षेत्र

Nov 23 2020

जब मैं पायथन 3.X में निम्नलिखित चलाता हूं

import datetime

DATE_TS_FORMAT = '%Y-%m-%d %H:%M:%S.%f %Z'

date_ts = datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
date_ts = datetime.datetime.strptime(date_ts, DATE_TS_FORMAT)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)

मुझे मिला

2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000 

समयक्षेत्र की जानकारी क्यों गायब हो गई और मैं इस मुद्दे को कैसे ठीक कर सकता हूं?

जवाब

2 MrFuppes Nov 24 2020 at 07:13

असंगत वास्तव में ... मुद्दा यह है कि है %Zबनाता strptime स्वीकार विशेष स्ट्रिंग (जीएमटी, UTC और में time.tzname किसी भी मूल्य - डॉक्स ), लेकिन वास्तव में इसे से बाहर कुछ भी नहीं है। उदाहरण के लिए:

from datetime import datetime

s = "2019-01-02 03:04:05.000000 UTC"
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f %Z')

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5)

परिणामी डेटाइम वस्तु भोली है; अब UTC का कोई संकेत नहीं है।

इस व्यवहार के लिए, आप डेटाटाइम ऑब्जेक्ट को पोस्ट-प्रोसेस कर सकते हैं, जैसे कुछ

if "UTC" in s: 
    dt = dt.replace(tzinfo=timezone.utc)

(जो मुझे लगता है कि एक सा दर्द होता है ...) या कुछ और के साथ "यूटीसी" की जगह है कि %zयूटीसी को पार्स करता है 1 ,

dt = datetime.strptime(s.replace("UTC", "+00:00"), '%Y-%m-%d %H:%M:%S.%f %z')

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)

(जो मुझे लगता है कि थोड़ा बदसूरत है ...) या उपयुक्त पार्सर का उपयोग करें, जैसे

from dateutil.parser import parse

dt = parse(s)

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=tzutc())

print(dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z'))
# 2019-01-02 03:04:05.000000 UTC

(यदि प्रदर्शन थोड़ा मुद्दा है तो थोड़ा धीमा होगा ...)।


1 IMO, यह असंगत भी है; "/00: 00" कुछ समय क्षेत्र का यूटीसी ऑफसेट हो सकता है जो उस समय पर 0 घंटे की यूटीसी ऑफसेट होता है ...