पायथन यूटीसी डेटाइम ऑब्जेक्ट के आईएसओ प्रारूप में जेड (ज़ुलु या शून्य ऑफसेट) शामिल नहीं है


120

क्यों python 2.7 में UTC डेटाइम ऑब्जेक्ट के isoformat स्ट्रिंग को जावास्क्रिप्ट के विपरीत Z अक्षर (ज़ुलु या शून्य ऑफसेट) शामिल नहीं किया गया है?

>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'

जबकि जावास्क्रिप्ट में

>>>  console.log(new Date().toISOString()); 
2013-10-29T09:38:41.341Z

1
पायथन डेटाइम मानों में NO timezone की जानकारी है। यदि आप अपने टाइम स्टैम्प में संग्रहीत समयक्षेत्र की जानकारी चाहते हैं तो पाइत्ज़ या बैबेल को आज़माएँ।
tnknepp

67
datetime.datetime.utcnow().isoformat() + 'Z'
JFS


3
..और लापता Z आश्चर्यजनक रूप से कुछ चीजों को काम नहीं करने का कारण बनता है जैसे एपीआई कॉल
इलायची

यह और भी खराब हो जाता है, अगर डेटाइम का अंतिम भाग 0 है, तो यह इसे छोटा कर देगा ...
ntg

जवाबों:


52

पायथन datetimeऑब्जेक्ट्स में डिफ़ॉल्ट रूप से समय क्षेत्र की जानकारी नहीं होती है, और इसके बिना, पायथन वास्तव में आईएसओ 8601 विनिर्देश का उल्लंघन करता है ( यदि कोई समय क्षेत्र की जानकारी नहीं दी जाती है, तो इसे स्थानीय समय माना जाता है )। आप कुछ डिफ़ॉल्ट समय क्षेत्र प्राप्त करने के लिए pytz पैकेज का उपयोग कर सकते हैं , या सीधे tzinfoअपने आप को उपवर्ग :

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)

तब आप मैन्युअल रूप से टाइम ज़ोन जानकारी जोड़ सकते हैं utcnow():

>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'

ध्यान दें कि यह आईएसओ 8601 प्रारूप के अनुरूप है, जो यूटीसी के लिए Zया +00:00प्रत्यय के रूप में अनुमति देता है । ध्यान दें कि उत्तरार्द्ध वास्तव में मानक के अनुरूप होता है, सामान्य रूप से किस समय क्षेत्र का प्रतिनिधित्व किया जाता है (यूटीसी एक विशेष मामला है।)।


108
मैं Zइसके बजाय कैसे शामिल करूं +00:00?
तेंदुए

14
चेतावनी !!! pytzअजगर के tzinfoप्रोटोकॉल का उल्लंघन करता है और उपयोग करने के लिए खतरनाक है! देखें blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html
ivan_pozdeev

@ivan_pozdeev लिंक के लिए धन्यवाद, बहुत दिलचस्प। ध्यान दें कि dateutilकाम करने की अनुमति देने वाले बदलाव PEP 495 के साथ Python 3.6 तक लागू नहीं किए गए थे, इसलिए यह कहना pytzकि मानक इंटरफ़ेस का उपयोग नहीं करना अनुचित है क्योंकि इंटरफ़ेस बदल गया। बदलाव से पहले इसे काम करने का एकमात्र तरीका pytzथा।
मार्क

67

विकल्प: isoformat()

पायथन यूटीसी के लिए 'जेड' प्रत्यय जैसे सैन्य टाइमजोन प्रत्यय का datetimeसमर्थन नहीं करता है । निम्नलिखित सरल स्ट्रिंग प्रतिस्थापन चाल करता है:

In [1]: import datetime

In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)

In [3]: str(d).replace('+00:00', 'Z')
Out[3]: '2014-12-10 12:00:00Z'

str(d) अनिवार्य रूप से के रूप में ही है d.isoformat(sep=' ')

देखें: डेटाइम, पायथन स्टैंडर्ड लाइब्रेरी

विकल्प: strftime()

या आप strftimeएक ही प्रभाव को प्राप्त करने के लिए उपयोग कर सकते हैं :

In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'

नोट: यह विकल्प केवल तभी काम करता है जब आपको पता हो कि निर्दिष्ट तिथि UTC में है।

देखें: datetime.strftime ()


अतिरिक्त: मानव पठनीय समयक्षेत्र

आगे जाकर, आप समय -समय पर ध्वज के pytzसाथ मानव पठनीय समयक्षेत्र सूचना प्रदर्शित करने में रुचि रख सकते हैं strftime %Z:

In [5]: import pytz

In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)

In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)

In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'

1
क्या विभाजक को Tरिक्त के बजाय नहीं होना चाहिए ?
मार्सेलो रोमानी

1
यह d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)पंक्ति 2 में होना चाहिए । Btw।, RFC3339 में यह कहता है कि एक स्थान 'ठीक' ('टी' के बजाय) है।
MrFuppes

16

निम्नलिखित जावास्क्रिप्ट और अजगर स्क्रिप्ट समान आउटपुट देते हैं। मुझे लगता है कि यह वही है जो आप ढूंढ रहे हैं।

जावास्क्रिप्ट

new Date().toISOString()

अजगर

import datetime

datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

वे जो आउटपुट देते हैं वह utc (zelda) का समय है, जिसे ISO स्ट्रिंग के रूप में 3 मिलीसेकंड महत्वपूर्ण अंक के साथ स्वरूपित किया गया है और इसे Z के साथ जोड़ा गया है।

2019-01-19T23:20:25.459Z

12

पायथन में = = 3.2 आप बस इसका उपयोग कर सकते हैं:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'

3
बहुत अच्छा समाधान। के बारे में उनके प्रश्न के लिए Z, आप ऑफसेट को क्लिप कर सकते हैं:.isoformat()[:-6] + 'Z'
मैक्सिमिलियन बर्स्ज़ले

11

पायथन डेटेटाइम्स थोड़े क्लंकी होते हैं। का उपयोग करें arrow

> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'

एरो में मूल रूप से डेटाइम के समान ही एपी है, लेकिन टाइमज़ोन और कुछ अतिरिक्त बारीकियों के साथ जो मुख्य पुस्तकालय में होना चाहिए।

जावास्क्रिप्ट के साथ संगत एक प्रारूप द्वारा प्राप्त किया जा सकता है:

arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'

जावास्क्रिप्ट Date.parseचुपचाप टाइमस्टैम्प से microseconds छोड़ देगा।


7
यह प्रश्न का उत्तर नहीं देता है क्योंकि स्ट्रिंग 'Z' के साथ समाप्त नहीं होती है।
कलीसिन

3

पोस्ट पर बहुत सारे अच्छे उत्तर हैं, लेकिन मैं चाहता था कि प्रारूप बिल्कुल वैसा ही निकले जैसा कि जावास्क्रिप्ट के साथ है। यह वही है जो मैं उपयोग कर रहा हूं और यह अच्छी तरह से काम करता है।

In [1]: import datetime

In [1]: now = datetime.datetime.utcnow()

In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'


2

मैंने कुछ लक्ष्यों के साथ इस समस्या का सामना किया:

  • ISO 8601 प्रारूप में UTC "जागरूक" डेटाइम स्ट्रिंग जनरेट करें
  • डेटाटाइम ऑब्जेक्ट और स्ट्रिंग निर्माण के लिए केवल पायथन स्टैंडर्ड लाइब्रेरी फ़ंक्शंस का उपयोग करें
  • Django timezoneउपयोगिता फ़ंक्शन और dateutilपार्सर के साथ डेटाटाइम ऑब्जेक्ट और स्ट्रिंग को मान्य करें
  • आईएसओ 8601 डेटाइम स्ट्रिंग को मान्य करने के लिए JavaScript फ़ंक्शंस का उपयोग करें UTC जागरूक

इस दृष्टिकोण में Z प्रत्यय शामिल नहीं है और इसका उपयोग नहीं किया गया है utcnow(), लेकिन यह पायथन प्रलेखन में सिफारिश पर आधारित है और यह Django और जावास्क्रिप्ट के साथ मस्टर को पारित करता है।

आइए यूटीसी टाइमजोन ऑब्जेक्ट को datetime.now()उपयोग करने के बजाय पास करके शुरू करें datetime.utcnow():

from datetime import datetime, timezone

datetime.now(timezone.utc)
>>> datetime.datetime(2020, 1, 8, 6, 6, 24, 260810, tzinfo=datetime.timezone.utc)

datetime.now(timezone.utc).isoformat()
>>> '2020-01-08T06:07:04.492045+00:00'

यह अच्छा लग रहा है, तो चलिए देखते हैं कि Django और क्या dateutilसोचते हैं:

from django.utils.timezone import is_aware

is_aware(datetime.now(timezone.utc))
>>> True

import dateutil.parser

is_aware(dateutil.parser.parse(datetime.now(timezone.utc).isoformat()))
>>> True

ठीक है, पायथन डेटाइम ऑब्जेक्ट और आईएसओ 8601 स्ट्रिंग यूटीसी "जागरूक" हैं। अब आइए नजर डालते हैं कि जावास्क्रिप्ट डेटाइम स्ट्रिंग के बारे में क्या सोचता है। इस उत्तर से उधार हमें मिलता है:

let date= '2020-01-08T06:07:04.492045+00:00';
const dateParsed = new Date(Date.parse(date))

document.write(dateParsed);
document.write("\n");
// Tue Jan 07 2020 22:07:04 GMT-0800 (Pacific Standard Time)

document.write(dateParsed.toISOString());
document.write("\n");
// 2020-01-08T06:07:04.492Z

document.write(dateParsed.toUTCString());
document.write("\n");
// Wed, 08 Jan 2020 06:07:04 GMT

आप इस ब्लॉग पोस्ट को भी पढ़ना चाह सकते हैं ।


1
बेस लाइब्रेरी फ़ंक्शंस से चिपके रहने और पुरानी पोस्ट पर आने के लिए बोनस।
विक्टर रोमियो

1

उपरोक्त सभी उत्तरों को मिलाकर मैं निम्नलिखित फंक्शन के साथ आया:

from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)


def getdata(yy, mm, dd, h, m, s) :
    d = datetime(yy, mm, dd, h, m, s)
    d = d.replace(tzinfo=simple_utc()).isoformat()
    d = str(d).replace('+00:00', 'Z')
    return d


print getdata(2018, 02, 03, 15, 0, 14)

1

मैं पेंडुलम का उपयोग करता हूं:

import pendulum


d = pendulum.now("UTC").to_iso8601_string()
print(d)

>>> 2019-10-30T00:11:21.818265Z

0
>>> import arrow

>>> now = arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS')
>>> now
'2018-11-28T21:34:59.235'
>>> zulu = "{}Z".format(now)
>>> zulu
'2018-11-28T21:34:59.235Z'

या, एक झटके में पाने के लिए:

>>> zulu = "{}Z".format(arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS'))
>>> zulu
'2018-11-28T21:54:49.639Z'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.