datetime.datetime.utcnow()
यह datetime
किसी भी समयक्षेत्र की जानकारी क्यों नहीं देता है कि यह स्पष्ट रूप से एक यूटीसी है datetime
?
मैं उम्मीद करूंगा कि इसमें यह शामिल होगा tzinfo
।
datetime.datetime.utcnow()
यह datetime
किसी भी समयक्षेत्र की जानकारी क्यों नहीं देता है कि यह स्पष्ट रूप से एक यूटीसी है datetime
?
मैं उम्मीद करूंगा कि इसमें यह शामिल होगा tzinfo
।
जवाबों:
इसका मतलब है कि यह टाइमज़ोन भोली है, इसलिए आप इसका उपयोग नहीं कर सकते datetime.astimezone
आप इसे इस तरह से टाइमजोन दे सकते हैं
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
अब आप टाइमज़ोन बदल सकते हैं
print(u.astimezone(pytz.timezone("America/New_York")))
किसी दिए गए टाइमज़ोन में वर्तमान समय पाने के लिए, आप datetime.now()
सीधे tzinfo पास कर सकते हैं:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
यह उन लोगों सहित किसी भी समयक्षेत्र के लिए काम करता है, जो दिन के समय की बचत समय (DST) का निरीक्षण करते हैं, अर्थात, यह टाइमज़ोन के लिए काम करता है, जिसमें अलग-अलग समय पर अलग-अलग utc ऑफसेट (गैर-फिक्स्ड utc ऑफसेट) हो सकते हैं। उपयोग न करें tz.localize(datetime.now())
- स्थानीय समय अस्पष्ट होने पर यह अंत-डीएसटी संक्रमण के दौरान विफल हो सकता है।
astimezone
। इसलिए डाइमटाइम के पास न केवल कोई देशी टाइमज़ोन है, बल्कि केवल व्यापक रूप से उपलब्ध tzinfo का कार्यान्वयन माना जाता है कि यह मानक के अनुरूप नहीं है।
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
; datetime.now(tz)
इसके बजाय उपयोग करें ।
ध्यान दें कि पायथन 3.2 के बाद, datetime
मॉड्यूल में शामिल है datetime.timezone
। के लिए प्रलेखन datetime.utcnow()
कहता है:
एक जागरूक वर्तमान UTC डेटाटाइम कॉल करके प्राप्त किया जा सकता है ।
datetime.now
(
timezone.utc
)
तो आप कर सकते हैं:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
या datetime.utcnow(timezone.utc)
?
datetime.utcnow()
कोई तर्क नहीं लेता। तो यह होना ही होगा datetime.now(timezone.utc)
।
datetime.now()
मशीन का समय datetime.utcnow()
वापस करेगा लेकिन वास्तविक UTC समय लौटाएगा।
datetime.utcnow()
यह tzinfo
इंगित करने के लिए सेट नहीं है कि यह यूटीसी है। लेकिन सेट के साथdatetime.now(datetime.timezone.utc)
UTC समय वापस करता है । tzinfo
tz
अब के कंस्ट्रक्टर में किसी वस्तु को पास करते हैं तो यह उस समय के समय को लौटा देगा? ठीक! इशारा करने के लिए धन्यवाद।
मानक पायथन पुस्तकालयों में किसी भी tzinfo कक्षाएं शामिल नहीं हैं (लेकिन पेप 431 देखें )। मैं केवल कारणों का अनुमान लगा सकता हूं। व्यक्तिगत रूप से मुझे लगता है कि UTC के लिए एक tzinfo वर्ग को शामिल नहीं करना एक गलती थी, क्योंकि यह एक मानक कार्यान्वयन के लिए पर्याप्त विवादास्पद है।
संपादित करें: हालांकि लाइब्रेरी में कोई कार्यान्वयन नहीं है, लेकिन tzinfo
प्रलेखन में एक उदाहरण के रूप में दिया गया है ।
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
इसका उपयोग करने के लिए, एक जागरूक डेटाटाइम ऑब्जेक्ट के रूप में वर्तमान समय प्राप्त करने के लिए:
from datetime import datetime
now = datetime.now(utc)
नहीं है datetime.timezone.utc
पायथन में 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
द्वारा बनाई गई वस्तुओं के लिए उपयोग किया जाता है utcnow()
) ...
timezone.utc
को आखिरकार पायथन 3.2 में जोड़ा गया है। पिछड़ी अनुकूलता के लिए, utcnow()
अभी भी एक समय-कम समय वाली वस्तु लौटाता है, लेकिन आप कॉल करके जो चाहें प्राप्त कर सकते हैं now(timezone.utc)
।
struct
मॉड्यूल यूनिकोड से बाईटस्ट्रिंग तक स्वचालित रूपांतरण करेगा, और एक खराब निर्णय को आगे बढ़ने से रोकने के लिए अंतिम निर्णय पहले पायथन 3 संस्करणों के साथ संगतता को तोड़ना था।
tzinfo
दस्तावेज में इसे लागू करने के लिए कोड के उदाहरण शामिल हैं, लेकिन वे स्वयं उस कार्यशीलता को डेटाइम में शामिल नहीं करते हैं! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
एक महान संसाधन है। जब तक मैंने अपना जवाब उदाहरण कोड में डालने के लिए संपादित किया था, तब तक किसी और ने पहले ही सुझाव दे दिया था और मैं उनकी गड़गड़ाहट को चोरी नहीं करना चाहता था।
pytz
मॉड्यूल एक विकल्प है, और वहाँ एक और है python-dateutil
जो हालांकि भी तीसरे पक्ष के पैकेज है पहले से ही अपने अन्य निर्भरता और ऑपरेटिंग सिस्टम के आधार पर उपलब्ध हो सकता है।
मैं इस पद्धति को संदर्भ के लिए शामिल करना चाहता था- यदि आपने पहले ही स्थापित कर लिया है python-dateutil
अन्य उद्देश्यों के लिए किया है, तो आप इसके tzinfo
साथ डुप्लिकेट करने के बजाय इसका उपयोग कर सकते हैंpytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
मैं सहमत हूँ कि कॉल करने के लिए सहमत हूँ utcnow
में UTC टाइमज़ोन जानकारी शामिल होनी चाहिए। मुझे संदेह है कि यह शामिल नहीं है क्योंकि देशी डेटाइम लाइब्रेरी क्रॉस संगतता के लिए भोली डेटासेट के लिए चूक करती है।
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
हमेशा काम करता है; datetime.now(dateutil.tz.tzlocal())
DST संक्रमण के दौरान विफल हो सकता है । PEP 495 - स्थानीय समयdateutil
की छूट भविष्य में स्थिति में सुधार कर सकती है ।
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(ध्यान दें: dateutil
गैर-नियत utc ऑफ़सेट के साथ (जैसे कि dateutil.tz.tzlocal()
) यहां विफल हो सकता है , इसके बजाय एक- pytz
आधारित समाधान का उपयोग करें )।
dateutil
के लिए dateutil.parser
, मैं इस समाधान सबसे अच्छा पसंद आया। यह रूप में सरल रूप में किया गया था: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
। वियोला !!
जूलियन डेंजौ ने एक अच्छा लेख लिखा है जिसमें बताया गया है कि आपको टाइमज़ोन से कभी नहीं निपटना चाहिए । अंश:
दरअसल, पायथन डेटटाइम एपीआई हमेशा अनजान डेटाइम वस्तुओं को लौटाता है, जो बहुत दुर्भाग्यपूर्ण है। वास्तव में, जैसे ही आप इस ऑब्जेक्ट को प्राप्त करते हैं, यह जानने का कोई तरीका नहीं है कि टाइमज़ोन क्या है, इसलिए ये ऑब्जेक्ट अपने आप पर बहुत "बेकार" हैं।
काश, भले ही आप उपयोग कर सकते हैं utcnow()
, आप अभी भी टाइमज़ोन जानकारी नहीं देखेंगे, जैसा कि आपने खोजा था।
अनुशंसाएँ:
हमेशा जागरूक
datetime
वस्तुओं का उपयोग करें, अर्थात समय क्षेत्र की जानकारी के साथ। यह सुनिश्चित करता है कि आप उनकी तुलना सीधे कर सकते हैं (जागरूक और अनजानdatetime
वस्तुएं तुलनीय नहीं हैं) और उन्हें उपयोगकर्ताओं को सही ढंग से वापस कर देगा। लीवरेज पाइत्ज़ में टाइमज़ोन ऑब्जेक्ट्स हैं।इनपुट और आउटपुट स्ट्रिंग प्रारूप के रूप में आईएसओ 8601 का उपयोग करें ।
datetime.datetime.isoformat()
टाइमस्टैम्प का उपयोग करने के लिए उपयोग करें क्योंकि उस प्रारूप का उपयोग करके स्ट्रिंग स्वरूपित होती है, जिसमें टाइमज़ोन जानकारी शामिल होती है।यदि आपको आईएसओ 8601 के स्वरूपित टाइमस्टैम्प वाले तार को पार्स करने की आवश्यकता है, तो आप इस पर भरोसा कर सकते हैं
iso8601
, जो सही टाइमज़ोन जानकारी के साथ टाइमस्टैम्प लौटाता है। यह टाइमस्टैम्प को सीधे तुलनीय बनाता है।
timezone
पायथन 3.2+ में जानकारी जोड़ने के लिए
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
पायथन 2.7.13 (डिफ़ॉल्ट, 19 जनवरी 2017, 14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
UTC तारीखों को किसी भी समयक्षेत्र की जानकारी की आवश्यकता नहीं है क्योंकि वे UTC हैं, जिसका अर्थ है कि उनका कोई ऑफसेट नहीं है।
pytz.utc
)। ध्यान दें कि एक मान के बीच एक बड़ा अंतर है जिसकी यूटीसी से ऑफसेट अज्ञात है और एक जहां इसे जाना जाता है। 0. बाद वाला वही है जो वापस लौटना utcnow()
चाहिए , आईएमओ। प्रलेखन के अनुसार "व्याख्या के लिए खुला नहीं है कि समय में एक विशिष्ट क्षण का प्रतिनिधित्व करने के लिए एक जागरूक वस्तु का उपयोग किया जाता है" के साथ फिट होगा।