पाइथन डेटाइम को स्ट्रैपटाइम के साथ युगांतर में परिवर्तित करें


209

मेरे पास यूटीसी में एक समय है जहां से मैं सेकंड की संख्या चाहता हूं।

मैं इसे सेकंड की संख्या में बदलने के लिए स्ट्रैफ़ाइम का उपयोग कर रहा हूं। उदाहरण के रूप में 1 अप्रैल 2012 को लेना।

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

1 अप्रैल 2012 की यूटीसी अवधि से 1333238400 है लेकिन यह उपरोक्त 1333234800 है जो 1 घंटे से अलग है।

तो ऐसा लग रहा है कि स्ट्रैपटाइम मेरे सिस्टम के समय को ध्यान में रख रहा है और कहीं-कहीं टाइमजोन शिफ्ट लागू करता है। मुझे लगा कि डेटाइम शुद्ध रूप से भोला था?

मैं उसके आसपास कैसे पहुंच सकता हूं? यदि संभव हो तो मानक के बिना अन्य पुस्तकालयों को आयात करने से बचें। (मुझे पोर्टेबिलिटी की चिंता है)।



11
क्या मैं केवल यह देख रहा हूँ कि आप संख्याओं में अष्टक का उपयोग करते हैं?
मछली मॉनिटर


3
नए पायथॉन 3.3+ मेंdatetime.datetime.timestamp(datetime.datetime.utcnow())
MarkHu

जवाबों:


389

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

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

पायथन 3.3+ में आप timestamp()इसके बजाय उपयोग कर सकते हैं :

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

आपको उपयोग क्यों नहीं करना चाहिए datetime.strftime('%s')

पायथन वास्तव में स्ट्रैटिफ़ाइम के तर्क के रूप में% s का समर्थन नहीं करता है (यदि आप http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior यह सूची में नहीं है), केवल कारण यह है कि काम कर रहा है क्योंकि पायथन आपके सिस्टम के स्ट्रैप्टाइम को जानकारी दे रहा है, जो आपके स्थानीय समयक्षेत्र का उपयोग करता है।

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

7
मैं यह जानने की कोशिश कर रहा हूं कि मैं स्ट्रैटिफाइम ("% s") को बहुत अधिक क्यों देख रहा हूं, फिर भी यह डॉक्स में नहीं है। इसके लिए धन्यवाद!
जोनाथन वानास्को

54
उपयोग न करें .strftime("%s"): यह समर्थित नहीं है, यह पोर्टेबल नहीं है, यह चुपचाप एक जागरूक डेटाटाइम ऑब्जेक्ट के लिए गलत परिणाम उत्पन्न कर सकता है, यह विफल रहता है यदि इनपुट UTC में है (जैसा कि प्रश्न में है) लेकिन स्थानीय
टाइमज़ोन

2
@earthmeLon आपकी ब्रैकेटिंग गलत है। Timedeltas (दो डेटाटाइम्स को घटाकर बनाया गया) में total_seconds हैं, लेकिन datetimes नहीं हैं।
jleahy

2
यह मेरे लिए काम नहीं कर रहा है:AttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
माइकल

3
@ मिचेल वह फ़ंक्शन पायथन 2.7 में नया है, आपको एक पुराने संस्करण का उपयोग करना चाहिए। 2.7 से पहले के संस्करणों के लिए आप कर सकते हैं td.seconds + td.days*24*3600। यह माइक्रोसेकंड भाग को अलग करता है।
जुलाई

100

मैं टाइमज़ोन और इस तरह के साथ गंभीर मुद्दे थे। जिस तरह से पायथन सभी को संभालता है वह बहुत भ्रमित करने वाला होता है (मेरे लिए)। कैलेंडर मॉड्यूल का उपयोग करके चीजें ठीक लग रही हैं (लिंक 1 , 2 , 3 और 4 देखें )।

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400

7
+1 क्योंकि यह एकमात्र उत्तर है जो प्रश्न में इनपुट के लिए काम करता है।
jfs 4

क्या यह पोर्टेबल है?
बेंजामिन

1
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, क्योंकि यह प्रश्न में चिंता का उत्तर देता है। vnice kudos
लियो प्रिंस

2
यह 'काम करता है', लेकिन नोट किए गए प्रश्न पर ध्यान दें: "मेरे पास यूटीसी में एक समय है" यह पद्धति हमेशा सिस्टम के स्थानीय समय क्षेत्र का उपयोग करेगी। टाइमजोन निर्दिष्ट करने का कोई तरीका नहीं है। यदि aprilFirstइस उदाहरण में एक 'जागरूक' उदाहरण है और सिस्टम के टाइमज़ोन से अलग टाइमज़ोन का उपयोग किया जाता है, तो परिणाम सही नहीं होगा ( timetuple()कॉल में टाइमज़ोन खो जाता है )। 'जागरूक' डेटाइम के लिए सही उत्तर प्राप्त करने के लिए आप awaredt.timestamp()हाल ही में पायथन 3. पर उपयोग कर सकते हैं । पायथन 2 के लिए यह कठिन है; एक तरीका arrowपुस्तकालय का उपयोग करना है। arrow.get(awaredt).timestampठीक हो जाएगा।
एडम विलियम्सन

1
अच्छा बिंदु, @AdamWilliamson, लेकिन उदाहरण में कोड datetimeऑब्जेक्ट को स्थानीय नहीं कर रहा है, इसलिए मैंने यह मान लिया कि "मेरे पास UTC में एक समय है" का अर्थ था कि ओपी के पास एक अनजान datetimeवस्तु थी जिसे ग्रहण किया गया था यूटीसी में , जिसके लिए वह चाहता था एक पाने के लिए epoch(अगर datetimeहुआ हो सकता है TZ-जागरूक होना, वास्तव में, चीजों को बदलना)। यह भी ध्यान रखें कि यह उत्तर लगभग 8 साल पुराना है और बहुत सी चीजें तब से हुई हैं ( arrowउदाहरण के लिए 2013 में जारी की गई थी)
बोरराजा

35
import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())

1
यह लिखने का एक गलत तरीका है time.time()( काम जारी रहने के mktime()दौरान डीएसटी बदलाव के दौरान विफल हो सकता है time.time())। और यह सवाल का जवाब नहीं देता है जब तक कि स्थानीय समयक्षेत्र यूटीसी (प्रश्न में इनपुट यूटीसी में है)। यहां तक ​​कि अगर इनपुट स्थानीय समय का प्रतिनिधित्व करता है, तो mktime()अतीत / भविष्य की तारीखों के लिए भी विफल हो सकता है अगर यह tz डेटाबेस का उपयोग नहीं करता है और अगर स्थानीय समय क्षेत्र में अलग-अलग utc ऑफसेट हो सकते हैं जैसे कि, 2010-2015 में यूरोप / मास्को - - इसके बजाय UTC समय (प्रश्न के अनुसार) या टाइमज़ोन-जागरूक डेटाटाइम ऑब्जेक्ट का उपयोग करें।
21

यहाँ एक स्थानीय समय (जैसे कि लौटा .now()) को युगांतरकारी टाइमस्टैम्प (द्वारा लौटाया गया mktime()) में परिवर्तित करने के साथ और भी मुद्दे हैं । यदि आप इसे पढ़ते हैं; आप समझते हैं कि UTC इनपुट (प्रश्न में प्रयुक्त) स्थानीय समय का प्रतिनिधित्व करने वाले एक भोली
भाली

14
import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(क्षमा करें, यह मुझे मौजूदा उत्तर पर टिप्पणी नहीं करने देगा)


ऐसा इसलिए है क्योंकि time.mktime microsecond भाग को ध्यान में नहीं रखता है, है ना?
एडुआर्डो

1
सही बात। टाइम ट्यूपल स्ट्रक्चर (C अकड़ के आधार पर) में माइक्रोसेकंड के लिए जगह नहीं होती है, इसलिए हमें डेटाइम ऑब्जेक्ट से जानकारी को हथियाने और इसे अंत में जोड़ने की जरूरत है।
चार्ल्स प्लेगर


मेरी मशीनों पर, यह सही ढंग से काम करता है, भले ही मेरा समय क्षेत्र ईटी है।
चार्ल्स प्लेगर

1
यह आपको सिस्टम के स्थानीय समय के आधार पर विभिन्न प्रणालियों पर अलग-अलग टाइमस्टैम्प देगा।
यूसुफ

6

यदि आपको यूनिक्स / एपोच समय में टाइमस्टैम्प की आवश्यकता है, तो यह एक पंक्ति काम करती है:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

और केवल datetime python2 और python3 में काम करता है पर निर्भर करता है


2

यह पायथन 2 और 3 में काम करता है:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

केवल आधिकारिक डॉक्स के बाद ... https://docs.python.org/2/library/time.html#module-time


1) यह मानता है कि आप अब एक यादृच्छिक डेटाटाइम ऑब्जेक्ट नहीं, परिवर्तित करना चाहते हैं। 2) आपको कैलेंडर की आवश्यकता नहीं है। time.mktime (randomDateTime.timetuple ()) + randomDateTime.microsecond * 1e-6
चार्ल्स प्लेजर

@CharlesPlager time.mktime गलत है; यह स्थानीय समयक्षेत्र में तर्क की व्याख्या करता है, जबकि ओपी UTC में व्याख्या किए गए समय को चाहता है (जैसा कि कैलेंडर.टाइमम करता है)।
स्टूजेसिक

यह मेरे लिए सबसे सटीक उत्तर है, यदि आप अपना समय GMT में बदलना चाहते हैं और आप इसे युगांतर टाइमस्टैम्प में परिवर्तित करना चाहते हैं।
यूसुफ

आपके उत्तर के बाद, Calendar.timegm (datetime.strptime ("2019-05-03T05: 40: 09.770494 + 00: 00" [: 16], '% Y-% m-% dT% H:% M')। timetuple ()) मैं यूटीसी में टाइमस्टैम्प और कोई बात नहीं क्या प्रणाली आप उस पर चलाने के लिए मुझे सही टाइमस्टैम्प देता है, चाल उपयोग strptime.timetumple है
यूसुफ

2

एक स्पष्ट टाइमज़ोन-स्वतंत्र समाधान के लिए, पाइत्ज़ लाइब्रेरी का उपयोग करें।

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

आउटपुट (फ्लोट): 1333238400.0


stackoverflow.com/a/21145908/4355695 पर एक समान उत्तर देखा , लेकिन यह वन-लाइनर के रूप में मेरे उपयोग के मामले के लिए बहुत अच्छा है, जहां आने वाला डेटा UTC में है और सिर्फ .timestamp () इसे स्थानीय समय में माना जा रहा था। ।
निखिल वीजे

यह 1970 से कम की तारीखों के लिए काम करता है। धन्यवाद। स्वीकृत उत्तर 1970 से कम तारीखों के लिए काम नहीं करता है। (पायथन 3.7.3 64-बिट एनाकोंडा 3)
5

-1

पायथन 3.7 में

दिनांक.isoformat () और datetime.isoformat () द्वारा उत्सर्जित प्रारूपों में से एक में डेट_स्ट्रीमिंग के अनुरूप एक डेटटाइम लौटाएं। विशेष रूप से, यह फ़ंक्शन प्रारूप (s) YYYY-MM-DD-* [HH [: MM [: SS [.fff [fff]]]] [+ HH: MM [: SS [.ffffff]]] में तार का समर्थन करता है। , जहां * किसी भी एक चरित्र का मिलान कर सकता है।

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat


1
विदित हो कि इसे पायथन 3.7 में पेश किया गया था।
कीथ्पजोलले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.