आप एक time.struct_time ऑब्जेक्ट को डेटाइम ऑब्जेक्ट में कैसे परिवर्तित करते हैं?


288

आप पायथन time.struct_timeऑब्जेक्ट को ऑब्जेक्ट में कैसे बदलते हैं datetime.datetime?

मेरे पास एक पुस्तकालय है जो पहले एक और दूसरा पुस्तकालय प्रदान करता है जो दूसरा चाहता है।

जवाबों:


384

एपच के बाद के समय (स्थानीय समय में) को सेकंड में बदलने के लिए time.mktime () का उपयोग करें , फिर डेटाटाइम ऑब्जेक्ट प्राप्त करने के लिए datetime.fromtimestamp () का उपयोग करें ।

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))

45
ध्यान दें कि यह 1900 से पहले विफल हो जाता है। आप आधुनिक लोग इस सीमा को कभी याद नहीं करते हैं!
mlissner

3
क्या यह tm_isdstडेटा खो देगा ? मुझे ऐसा लगता है, परिणामी डेटाटाइम ऑब्जेक्ट भले ही उस Noneपर वापस लौटने के लिए भोली हो । .dst()struct.tm_isdst1
n611x007

3
यह आमतौर पर काम करेगा। हालांकि, यह विफल हो जाएगा यदि समय टपल मूल्यों से परे है, उदाहरण के लिए मान (1970, 1, 1, 0, 0, 0, 0, 1, -1)। मैंने एक HTTP अनुरोध पर दिनांक शीर्ष लेख को पार्स करने के बाद इसका सामना किया है जिसने इस टपल को वापस कर दिया।
user3820547

3
@richvdh: C मानक निर्दिष्ट करता है कि mktime()इसे ध्यान tm_isdstमें रखना चाहिए और अजगर ने CPython पर time.mktime()C mktime()फ़ंक्शन को कॉल किया । mktime()गलत स्थान का चयन तब कर सकते हैं जब वह अस्पष्ट हो (जैसे, एंड-ऑफ-डीएसटी ("फॉल बैक") संक्रमण के दौरान) यदि दिया गया struct.tm_isdstहै -1या यदि mktime()दिए गए प्लेटफ़ॉर्म पर इनपुट को अनदेखा करता हैtm_isdst । इसके अलावा, अगर स्थानीय टाइमज़ोन में अतीत में अलग-अलग utc ऑफ़सेट थे और C mktime()एक ऐतिहासिक tz डेटाबेस का उपयोग नहीं करता है जो पुराने utc ऑफ़सेट मान प्रदान कर mktime()सकता है तो गलत (उदाहरण के लिए, एक घंटे के द्वारा) मान भी लौटा सकता है।
JFS

1
@naxa: यदि mktime()उपेक्षा नहीं करता tm_isdstदिए गए मंच पर (यह मेरा पर करता है) तो fromtimestamp()निश्चित रूप से जानकारी खो देता है: लौटे अनुभवहीन datetime वस्तु स्थानीय समय का प्रतिनिधित्व करने अस्पष्ट (टाइमस्टैम्प हो सकता है -> स्थानीय समय नियतात्मक (है हम छलांग सेकंड की अनदेखी करता है, तो), लेकिन local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also, अगर यह एक ऐतिहासिक tz डेटाबेस का उपयोग नहीं करता है तो fromtimestamp () `गलत utc ऑफ़सेट चुन सकता है।
jfs

123

ऐशे ही:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)

3
# समय पर मत भूलिए,
डाइमटाइम

7
@jhwist - कुछ चीजों पर लोगों को अपने दम पर इसका पता लगाने के लिए भरोसा किया जा सकता है :)
21

14
@ *और **वाक्यविन्यास को अलग करने के लिए आपको अलग-अलग तर्क देने के लिए किसी सूचीबद्ध या तानाशाही प्रकार की वस्तु का विस्तार करने की अनुमति देता है - यह पायथन प्यारेपन के मेरे पसंदीदा टुकड़ों में से एक है। अधिक जानकारी के लिए docs.python.org/2/tutorial/… देखें
ऑर्गैनिकपांडा

10
बस याद रखें कि यह आपको एक वैल्यू प्रदान करेगा यदि स्ट्रक्चर_टाइम में लीपसेकंड है, जैसे:t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
berdario

7
@berdario: मानों को संगत करने के लिए datetime: datetime(*t[:5]+(min(t[5], 59),))जैसे, स्वीकार करना "2015-06-30 16:59:60 PDT"
jfs

37

यह आपके प्रश्न का सीधा उत्तर नहीं है (जिसका उत्तर पहले ही दिया जा चुका है)। हालाँकि, कई बार मुझे मौलिक रूप से कई बार काटने के बाद भी, मैं इस बात पर जोर नहीं दे सकता कि यह आपके समय को देखने के लिए आपको घेर लेगा कि आपका time.struct_time ऑब्जेक्ट क्या प्रदान कर रहा है, बनाम अन्य समय क्षेत्र क्या हो सकते हैं।

मान लें कि आपके पास एक time.struct_time ऑब्जेक्ट है, और कुछ अन्य दिनांक / समय स्ट्रिंग, दोनों की तुलना करें, और सुनिश्चित करें कि आप डेटा नहीं खो रहे हैं और अनजाने में एक भोली डेटाइम ऑब्जेक्ट बना रहे हैं, जब आप अन्यथा कर सकते हैं।

उदाहरण के लिए, उत्कृष्ट फीडपर्सर मॉड्यूल एक "प्रकाशित" फ़ील्ड लौटाएगा और अपने "प्रकाशित_प्रदर्शित" फ़ील्ड में एक time.struct_time ऑब्जेक्ट वापस कर सकता है:

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)

अब ध्यान दें कि आपको वास्तव में "प्रकाशित" फ़ील्ड के साथ क्या मिलता है।

Mon, 09 Sep 2013 19:57:42 -0400

द्वारा स्टॉलमैन की दाढ़ी! समयक्षेत्र की जानकारी!

इस मामले में, आलसी आदमी समय की जानकारी रखने के लिए उत्कृष्ट डेट्यूटिल मॉड्यूल का उपयोग करना चाह सकता है:

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()

जो हमें देता है:

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00

एक तो UTC या जो कुछ भी आपको लगता है कि सभी समय को सामान्य करने के लिए टाइमजोन-जागरूक डेटाटाइम ऑब्जेक्ट का उपयोग कर सकता है।


7
*_parsedफीडपार्स किए गए सभी फ़ील्ड पहले से ही UTC के लिए सामान्यीकृत हैं क्योंकि दिनांक पार्सिंग दस्तावेज़ में जाँच की जा सकती है ताकि यह निरर्थक हो।
२१:४४ पर

1
@itorres: अगर मैं इसे समझता हूं, तो यह उत्तर UTC के सामान्यीकरण के बारे में नहीं है, बल्कि समय-सारणी की जानकारी को किसी ऐसी datetimeवस्तु में रखने के बारे में है, जो feedparserकच्चे तार की तारीखों को पार करते समय खो जाती है।
davidag
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.