डेटाइमटाइम / लाइफटाइम .utnow () में टाइमज़ोन की जानकारी क्यों नहीं है?


285
datetime.datetime.utcnow()

यह datetimeकिसी भी समयक्षेत्र की जानकारी क्यों नहीं देता है कि यह स्पष्ट रूप से एक यूटीसी है datetime?

मैं उम्मीद करूंगा कि इसमें यह शामिल होगा tzinfo


एक सामान्य आईएसओ प्रारूप दिनांक फ़ील्ड को कैसे परिवर्तित करें जो कि टाइप टू स्ट्रिंग प्रारूप है?
नवी

जवाबों:


192

इसका मतलब है कि यह टाइमज़ोन भोली है, इसलिए आप इसका उपयोग नहीं कर सकते 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())- स्थानीय समय अस्पष्ट होने पर यह अंत-डीएसटी संक्रमण के दौरान विफल हो सकता है।


216
लेकिन इसका कोई अच्छा कारण नहीं है कि समय-समय पर भोले बने रहें - यह यूटीसी होना निर्दिष्ट है। इसे ठीक से काम करने के लिए आपको तीसरे पक्ष के पुस्तकालय की खोज करने की आवश्यकता क्यों है?
मार्क रैनसम

4
मैं सहमत हूँ; मेरे लिए 'भोले' समय पूरी तरह से बेकार हैं। Pdz को stdlib में जोड़ने के बारे में इस समय अजगर सूची पर चर्चा है; मुद्दा लाइसेंसिंग नहीं है लेकिन यह तथ्य है कि टाइमज़ोन डेटा को इतनी बार अपडेट किया जाता है (जो कि पायथन स्वयं नहीं हो सकता है)। यदि आप शहर के कुछ समय का उपयोग करने का प्रयास करते हैं, तो आप भी अपेक्षित तरीके से tzinfo इंटरफ़ेस को लागू नहीं कर सकते हैं astimezone। इसलिए डाइमटाइम के पास न केवल कोई देशी टाइमज़ोन है, बल्कि केवल व्यापक रूप से उपलब्ध tzinfo का कार्यान्वयन माना जाता है कि यह मानक के अनुरूप नहीं है।
बोबिन्स

5
@bobince pytz और मानक डेटाटाइम लाइब्रेरी आपके लिए काम क्यों नहीं करते हैं? पायथन कोर और स्वतंत्र परियोजनाओं के रूप में विकसित होने वाली पाइट्स कोर टीम के लिए लॉजिस्टिक जटिलता को कम करती है। हां, पायथन कोर टीम के लिए जटिलता को कम करना उन सभी पायथन उपयोगकर्ताओं के लिए जटिलता बढ़ाता है जिन्हें टाइमज़ोन से निपटने की जरूरत है लेकिन, मुझे विश्वास है कि उन्होंने एक अच्छे कारण के लिए यह निर्णय लिया। नियम "मानक पुस्तकालय में कोई tzinfo उदाहरण नहीं है ..." महान है क्योंकि यह सरल है, यहां अपवाद क्यों करें?
डेरेक लित्ज़

15
कैसे बस के बारे मेंu=datetime.now(pytz.utc)
क्रेग मैकक्वीन

4
@ मुख्य: उपयोग नहीं करते tz.localize(datetime.now()); datetime.now(tz)इसके बजाय उपयोग करें ।
JFS

142

ध्यान दें कि पायथन 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)

2
कौन सा पसंद किया जाता है? datetime.now(timezone.utc)या datetime.utcnow(timezone.utc)?
जेसी वेब वेब

8
datetime.utcnow()कोई तर्क नहीं लेता। तो यह होना ही होगा datetime.now(timezone.utc)
क्रेग मैकक्वीन

1
datetime.now()मशीन का समय datetime.utcnow()वापस करेगा लेकिन वास्तविक UTC समय लौटाएगा।
बाबू

13
@ बाबू: datetime.utcnow()यह tzinfoइंगित करने के लिए सेट नहीं है कि यह यूटीसी है। लेकिन सेट के साथdatetime.now(datetime.timezone.utc) UTC समय वापस करता है । tzinfo
क्रेग मैकक्वीन

@ CraigMcQueen तो अगर हम tzअब के कंस्ट्रक्टर में किसी वस्तु को पास करते हैं तो यह उस समय के समय को लौटा देगा? ठीक! इशारा करने के लिए धन्यवाद।
बाबू

71

मानक पायथन पुस्तकालयों में किसी भी 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)

8
जाने क्यों यह वर्ग पहली जगह में प्रदान नहीं किया गया था (और, इससे भी महत्वपूर्ण बात, इसके datetimeद्वारा बनाई गई वस्तुओं के लिए उपयोग किया जाता है utcnow()) ...
एंड्रे कैरन

17
टाइमज़ोन ऑब्जेक्ट timezone.utcको आखिरकार पायथन 3.2 में जोड़ा गया है। पिछड़ी अनुकूलता के लिए, utcnow()अभी भी एक समय-कम समय वाली वस्तु लौटाता है, लेकिन आप कॉल करके जो चाहें प्राप्त कर सकते हैं now(timezone.utc)
मिथिथ

4
@rgove, यह गलत है कि पाइथन 3 के लिए निष्पक्ष खेल माना जाता था कि सही करने की तरह है। वे पिछड़े संगतता के बारे में चिंतित नहीं होना चाहिए। एक और उदाहरण है जिसे मैंने पिछले कुछ दिनों के भीतर पढ़ा था - structमॉड्यूल यूनिकोड से बाईटस्ट्रिंग तक स्वचालित रूपांतरण करेगा, और एक खराब निर्णय को आगे बढ़ने से रोकने के लिए अंतिम निर्णय पहले पायथन 3 संस्करणों के साथ संगतता को तोड़ना था।
मार्क रैनसम

2
मैं दुखी हूं कि पायथन के tzinfoदस्तावेज में इसे लागू करने के लिए कोड के उदाहरण शामिल हैं, लेकिन वे स्वयं उस कार्यशीलता को डेटाइम में शामिल नहीं करते हैं! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
LS

1
@ एलएस, pytzएक महान संसाधन है। जब तक मैंने अपना जवाब उदाहरण कोड में डालने के लिए संपादित किया था, तब तक किसी और ने पहले ही सुझाव दे दिया था और मैं उनकी गड़गड़ाहट को चोरी नहीं करना चाहता था।
मार्क रैनसम

20

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 टाइमज़ोन जानकारी शामिल होनी चाहिए। मुझे संदेह है कि यह शामिल नहीं है क्योंकि देशी डेटाइम लाइब्रेरी क्रॉस संगतता के लिए भोली डेटासेट के लिए चूक करती है।


1
NameError: नाम 'dt' परिभाषित नहीं है
xApple

मैं datetime.datetime.utcfromtimestamp () कॉल का उपयोग कर रहा था, और tzinfo को जोड़ने की आवश्यकता थी, दूसरे समाधान ने मेरे लिए काम किया: utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
इयान ली

1
नोट: इसके विपरीत datetime.now(pytz_tz)हमेशा काम करता है; datetime.now(dateutil.tz.tzlocal())DST संक्रमण के दौरान विफल हो सकता हैPEP 495 - स्थानीय समयdateutil की छूट भविष्य में स्थिति में सुधार कर सकती है ।
jfs


चूंकि मेरे कार्यक्रम पहले से ही आयात कर रहा था dateutilके लिए dateutil.parser, मैं इस समाधान सबसे अच्छा पसंद आया। यह रूप में सरल रूप में किया गया था: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())। वियोला !!
एलएस

11

जूलियन डेंजौ ने एक अच्छा लेख लिखा है जिसमें बताया गया है कि आपको टाइमज़ोन से कभी नहीं निपटना चाहिए । अंश:

दरअसल, पायथन डेटटाइम एपीआई हमेशा अनजान डेटाइम वस्तुओं को लौटाता है, जो बहुत दुर्भाग्यपूर्ण है। वास्तव में, जैसे ही आप इस ऑब्जेक्ट को प्राप्त करते हैं, यह जानने का कोई तरीका नहीं है कि टाइमज़ोन क्या है, इसलिए ये ऑब्जेक्ट अपने आप पर बहुत "बेकार" हैं।

काश, भले ही आप उपयोग कर सकते हैं utcnow(), आप अभी भी टाइमज़ोन जानकारी नहीं देखेंगे, जैसा कि आपने खोजा था।

अनुशंसाएँ:

  • हमेशा जागरूक datetimeवस्तुओं का उपयोग करें, अर्थात समय क्षेत्र की जानकारी के साथ। यह सुनिश्चित करता है कि आप उनकी तुलना सीधे कर सकते हैं (जागरूक और अनजान datetime वस्तुएं तुलनीय नहीं हैं) और उन्हें उपयोगकर्ताओं को सही ढंग से वापस कर देगा। लीवरेज पाइत्ज़ में टाइमज़ोन ऑब्जेक्ट्स हैं।

  • इनपुट और आउटपुट स्ट्रिंग प्रारूप के रूप में आईएसओ 8601 का उपयोग करें । datetime.datetime.isoformat()टाइमस्टैम्प का उपयोग करने के लिए उपयोग करें क्योंकि उस प्रारूप का उपयोग करके स्ट्रिंग स्वरूपित होती है, जिसमें टाइमज़ोन जानकारी शामिल होती है।

  • यदि आपको आईएसओ 8601 के स्वरूपित टाइमस्टैम्प वाले तार को पार्स करने की आवश्यकता है, तो आप इस पर भरोसा कर सकते हैं iso8601, जो सही टाइमज़ोन जानकारी के साथ टाइमस्टैम्प लौटाता है। यह टाइमस्टैम्प को सीधे तुलनीय बनाता है।


1
यह थोड़ी भ्रामक सिफारिश है। अंगूठे का नियम है, टाइमजोन के साथ कभी भी व्यवहार न करें। हमेशा tz अनवेयर utc ऑब्जेक्ट (epoch ऑब्जेक्ट) को स्टोर और ट्रांसमिट करें।
टाइमज़ोन

1
ऐसा लगता है कि यह पहले से ही जूलियन के विचारों से काफी मेल खाता है। उनकी कौन सी विशिष्ट सिफारिशें (जैसा कि ऊपर संदर्भित है) भ्रामक हैं?
जो डी 'एंड्रिया

10

timezoneपायथन 3.2+ में जानकारी जोड़ने के लिए

import datetime

>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'

1
AttributeError: 'module' object has no attribute 'timezone' पायथन 2.7.13 (डिफ़ॉल्ट, 19 जनवरी 2017, 14:48:08)
मार्सिन ओवसियानी

-6
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]

-13

UTC तारीखों को किसी भी समयक्षेत्र की जानकारी की आवश्यकता नहीं है क्योंकि वे UTC हैं, जिसका अर्थ है कि उनका कोई ऑफसेट नहीं है।


10
जहां तक ​​मैं docs.python.org/library/datetime.html से बता सकता हूं , एक tzinfo के बिना एक डेटाइम वह है जहां समय क्षेत्र अनिर्दिष्ट है। यहां समय क्षेत्र निर्दिष्ट किया गया है, इसलिए तार्किक रूप से यह मौजूद होना चाहिए। एक संबंधित समय क्षेत्र के बिना दिनांक / समय के बीच एक बड़ा अंतर है और एक जो निश्चित रूप से यूटीसी में है। (आदर्श रूप से वे अलग-अलग प्रकार के IMO होने चाहिए, लेकिन यह एक और मामला है ...)
जॉन स्कीट

@JonSkeet मुझे लगता है कि आपको इग्नासियो की बात याद आ रही है कि UTC एक टाइमज़ोन नहीं है। कमाल है कि इस जवाब में -9 स्कोर है जैसा कि मैंने यह टाइप किया ...
CS

3
@CS: खैर इग्नासियो ने कभी यह नहीं कहा कि ... और कड़ाई से यूटीसी बोलने का समय क्षेत्र नहीं है, यह आमतौर पर जीवन को सरल बनाने के लिए एक के रूप में व्यवहार किया जाता है (पाइथन सहित, जैसे pytz.utc)। ध्यान दें कि एक मान के बीच एक बड़ा अंतर है जिसकी यूटीसी से ऑफसेट अज्ञात है और एक जहां इसे जाना जाता है। 0. बाद वाला वही है जो वापस लौटना utcnow() चाहिए , आईएमओ। प्रलेखन के अनुसार "व्याख्या के लिए खुला नहीं है कि समय में एक विशिष्ट क्षण का प्रतिनिधित्व करने के लिए एक जागरूक वस्तु का उपयोग किया जाता है" के साथ फिट होगा।
जॉन स्कीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.