पायथन में UTC समय कैसे प्राप्त करें?


113

मैं एक समाधान के लिए StackExchange पर एक गुच्छा खोज रहा हूँ, लेकिन मुझे जो चाहिए वह कुछ नहीं करता है। जावास्क्रिप्ट में, मैं 1 जनवरी 1970 से यूटीसी समय की गणना करने के लिए निम्नलिखित का उपयोग कर रहा हूं:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

समतुल्य पायथन कोड क्या होगा?



रुको, आप पायथन या जावास्क्रिप्ट का उपयोग कर रहे हैं?
CheetSheatOverlode 1

जवाबों:


179

इस कोड को आज़माएं जो datetime.utcnow का उपयोग करता है () :

from datetime import datetime
datetime.utcnow()

अपने उद्देश्यों के लिए जब आपको दो तिथियों के बीच बिताए गए समय की मात्रा की गणना करने की आवश्यकता होती है, जिसकी आपको समाप्ति और प्रारंभ तिथियों को बदलने की आवश्यकता होती है। इस तरह के घटाव के परिणाम एक समयबद्ध वस्तु हैं।

अजगर डॉक्स से:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

और इसका मतलब है कि डिफ़ॉल्ट रूप से आप इसमें बताए गए किसी भी क्षेत्र को प्राप्त कर सकते हैं - दिन, सेकंड, माइक्रोसेकंड, मिलीसेकंड, मिनट, घंटे, सप्ताह। इसके अलावा टाइमडेल्टा उदाहरण में total_seconds () विधि है जो:

अवधि में निहित सेकंड की कुल संख्या लौटाएं। समतुल्य (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 के साथ बराबर सच विभाजन सक्षम है।


2
संभवतः datetime.utcnow () के बारे में बुरा आश्चर्य यह है कि नाम के बावजूद समय-जागरूक वस्तु वापस नहीं आती है। यह मेरी राय में एक बड़ी समस्या है, यही वजह है कि मैं नीचे अपना जवाब पसंद करता हूं। "अनुप्रयोग के बिना कोई टाइमज़ोन के साथ डेटाटाइम ऑब्जेक्ट्स को" बग "माना जाना चाहिए।" julien.danjou.info/python-and-timezones
टिम रिचर्डसन

1
तथाकथित भोली-भाली वस्तु की अवधारणा (अर्थात, कोई समय क्षेत्र जानकारी सेट नहीं है) एक उद्देश्य की पूर्ति करता है: मैं चाहता हूं कि मेरी अलार्म घड़ी हर दिन 06:00:00 बजे रिंग करे, चाहे दुनिया में मैं कहीं भी क्यों न हो। इसके अलावा यह कंप्यूटर गेम में "वर्चुअल घड़ियों" के लिए अनुमति देता है: यह अब मेरी कल्पना की दुनिया में शाम 5 बजे है। विशेष रूप से टाइमडेल्टा अंकगणित के साथ, विशेष रूप से डेटाटाइम ऑब्जेक्ट पर एक टाइमज़ोन मजबूर करना अजीब होगा।
डस्टबाइट

42

अपने मूल के निकटतम रूप में:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

यदि आपको मूल निवासी पायथन के बजाय 1970-01-01 से सेकंड की संख्या जानने की आवश्यकता है datetime, तो इसका उपयोग करें:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

अजगर के नामकरण परंपराएं हैं जो कि आपके द्वारा जावास्क्रिप्ट में उपयोग किए जाने वाले बाधाओं के साथ हैं, पीईपी 8 देखें । इसके अलावा, एक फ़ंक्शन जो किसी अन्य फ़ंक्शन का परिणाम देता है, बल्कि मूर्खतापूर्ण है; यदि यह सिर्फ इसे और अधिक सुलभ बनाने की बात है, तो आप इसे केवल असाइन करके फ़ंक्शन के लिए दूसरा नाम बना सकते हैं। ऊपर दिए गए पहले उदाहरण को इसके साथ प्रतिस्थापित किया जा सकता है:

utc_now = datetime.datetime.utcnow

1
मुझे आपका उत्तर ऊपर से उच्च श्रेणी निर्धारण से बेहतर लगता है। यहां की गहराई के लिए धन्यवाद।
जॉर्डन डेआ-मैटसन

@ जोर्डन, मेरे जवाब को देखकर मुझे एहसास हुआ कि मैंने वैश्विक स्तर के बजाय फंक्शन के अंदर आयात करके एक शैलीगत गलती की है, मैं अब इसे ठीक करने जा रहा हूं।
मार्क रैनसम

8
हो सकता है कि आपको दूसरे फ़ंक्शन में UtcNow () को लपेटने पर विचार करना चाहिए। यह बहुत आसान है। साथ ही अंडरस्कोर का इस्तेमाल न करें। PEP 8 कितना उबाऊ है ...
vcarel

1
निश्चित रूप से एक साधारण एक लाइनर को वापस करने के लिए फ़ंक्शन लिखने की आवश्यकता नहीं है ... datetime.datetime.utcnow ()
cpreid

1
@TimRichardson मैं असहमत नहीं हूँ, लेकिन जिस समय यह उत्तर लिखा गया था उसका कोई विकल्प नहीं था - अजगर ने किसी भी tzinfoवस्तु को शामिल नहीं किया , यहाँ तक कि यूटीसी के लिए भी।
मार्क रैनसम

31

आधुनिक अजगर के लिए केवल सरल, मानक पुस्तकालय। इसके विपरीत, टाइमजोन-जागरूक डेटाइम देता है datetime.utcnow()datetimesबिना टाइमज़ोन के दुर्घटनाएँ घटित होती हैं।

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

5
पायथन 3 प्रलेखन के अनुसार यह इसे करने का अनुशंसित तरीका है।
रोस्ककॉरी

साफ और आसान! पसंदीदा तरीका होना चाहिए।
Mar3535

21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

10

डेटटाइम लाइफटाइम से आप पहले ही टाइमस्टैम्प को मेथड स्ट्रैप्टम के साथ एक्सपोर्ट कर सकते हैं। अपने कार्य उदाहरण के बाद:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

यदि आप माइक्रोसेकंड चाहते हैं, तो आपको निर्यात स्ट्रिंग बदलने और फ़्लोट करने के लिए कास्ट करने की आवश्यकता है: return float(now.strftime("%s.%f"))


एक स्ट्रिंग में बदलने की क्या बात है और फिर एक नंबर पर वापस जब आप सीधे नंबर प्राप्त कर सकते हैं?
मार्क रैनसम

मुद्दा यह है कि आप फ़ंक्शन पर चीजों को बदलना चाहते हैं और इस कारण से time.time()डेटाइम ऑब्जेक्ट के लिए बेहतर छड़ी है, उपयोग नहीं कर रहे हैं , आप सीधे int में बदलने के लिए time.mktime (now.timetuple ()) का भी उपयोग कर सकते हैं। वैसे भी, इस सरल मामले के time.time()लिए भी एक वैध विकल्प है। जो मुझे अजीब लगता है, सेकंड खोजने के लिए टाइमडेल्टा द्वारा जा रहा है।
हेक्टरकैंटो

ध्यान दें, strftime("%s")यह प्लेटफॉर्म पर निर्भर है और विंडोज पर काम नहीं करता है। (कम से कम यह मेरे लिए विंडोज 10 पर नहीं है)।
जूलियन किर्श

8

शून्य बाह्य निर्भरता के साथ जागरूक समयक्षेत्र:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

पैंथन 3 में लैम्ब्डा अभिव्यक्ति का उपयोग करते हुए, बाहर की कोशिश करो;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

और फ़ंक्शन को सामान्य रूप से कॉल करें;

print(utc_now())

2
अब अच्छे बनो; ^)
डेमिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.