पाइथन भविष्य में पाँच मिनट यूनिक्स टाइमस्टैम्प बनाएं


297

मुझे भविष्य में 5 मिनट के लिए "एक्सपायर" मूल्य बनाना होगा, लेकिन मुझे इसे UNIX टाइमस्टैम्प प्रारूप में आपूर्ति करना होगा। मेरे पास यह अभी तक है, लेकिन यह एक हैक की तरह लगता है।

def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    epoch = datetime.datetime(1970, 1, 1)
    seconds_in_a_day = 60 * 60 * 24
    five_minutes = datetime.timedelta(seconds=5*60)
    five_minutes_from_now = datetime.datetime.now() + five_minutes
    since_epoch = five_minutes_from_now - epoch
    return since_epoch.days * seconds_in_a_day + since_epoch.seconds

क्या कोई मॉड्यूल या फ़ंक्शन है जो मेरे लिए टाइमस्टैम्प रूपांतरण करता है?


7
मैं इस प्रश्न के विषय को बदलने की सलाह देता हूं। सवाल अच्छा है, लेकिन यह यूनिक्स टाइमस्टैम्प के लिए डेटाटाइम को परिवर्तित करने के बारे में नहीं है। यह भविष्य में 5 मिनट के लिए यूनिक्स टाइमस्टैम्प कैसे प्राप्त करें, इसके बारे में है।
DA

मैं असहमत हूं, @DA अनिवार्य रूप से कहता है कि "मुझे X और Y करने की आवश्यकता है। यहां मेरे पास अभी क्या है। Y करने के लिए बेहतर तरीका क्या है?" शायद एक्स करने के बेहतर तरीके हैं, लेकिन शीर्षक और शरीर स्पष्ट रूप से वाई के बारे में पूछते हैं
रोब केनेडी

6
मैं आपके साथ सवाल पर पूरी तरह सहमत हूं, और मुझे लगता है कि यह एक अच्छा जवाब है। समस्या "यूथ टाइमस्टैम्प के लिए पायथन डेटाइम" है जो प्रश्न या उत्तर को प्रतिबिंबित नहीं करता है। मैंने इस पोस्ट को रूपांतरण करने का तरीका खोजा, और भ्रामक विषय पंक्ति के कारण मैंने समय खो दिया। मेरा सुझाव है: "पाइथन, भविष्य में 5 मिनट UNIX टाइमस्टैम्प के रूप में"
DA

3
@ जिमीकेन - डेट टाइम से टाइमस्टैम्प प्राप्त करने के बारे में एक बहुत व्यापक जवाब यहां पाया जा सकता है: stackoverflow.com/questions/8777753/…
टिम टिस्डल

@TimTisdall हां शीर्षक बदलने के बाद से इसका कोई मतलब नहीं है
जिमी केन

जवाबों:


349

एक और तरीका है calendar.timegm:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())

यह %sध्वज से अधिक पोर्टेबल है strftime(जो विंडोज पर काम नहीं करता है)।


धन्यवाद डी। शॉली। मदद (datetime.timedelta) ने उस शॉर्टकट का उल्लेख नहीं किया। इसमें केवल दिन, सेकंड और माइक्रोसेकंड थे।
डैनियल रोडेन

12
ध्यान दें कि, पिछले दो टिप्पणियों के संयोजन, सही समाधान है: calendar.timegm(future.utctimetuple())। यह सुनिश्चित करता है कि एक यूटीसी समय पास किया जाए calendar.timegm
परछाई

1
Upvote @ tumbleweed की टिप्पणी पर्याप्त नहीं हो सकती। यदि आप UNIX टाइमस्टैम्प (और इसलिए UTC में एक) प्राप्त करने की कोशिश कर रहे हैं, तो Calendar.timegm का उपयोग करें।
बियालकी

@tumbleweed, ठीक है। यदि आप mktime का उपयोग करते हैं तो gmtime (0) का परिणाम UTC के अलावा किसी भी समय क्षेत्र के लिए नॉनजेरो राउंडट्रिप डेल्टा में होगा। 21600.0मेरी यूनिक्स मशीन के TZ के लिए 0.0 के बजाय सेकंड (6 घंटे) देता है
हॉब्स

यदि आप UTC टाइमस्टैम्प प्राप्त करना चाहते हैं तो आपको इसका उपयोग करना चाहिए calendar.timegm(datetime.datetime.utcnow().timetuple()):। विधि का उपयोग datetime.datetime.now().utctimetuple()मेरे लिए काम नहीं करता है (पायथन 3.2)।
वूकी 8

155

अब पायथन> = 3.3 में आप टाइमस्टैम्प को फ्लोट के रूप में प्राप्त करने के लिए टाइमस्टैम्प () विधि कह सकते हैं ।

import datetime
current_time = datetime.datetime.now(datetime.timezone.utc)
unix_timestamp = current_time.timestamp() # works if Python >= 3.3

unix_timestamp_plus_5_min = unix_timestamp + (5 * 60)  # 5 min * 60 seconds

4
इसके लिए +1। इसे बहुत अधिक प्रदर्शित किया जाना चाहिए, क्योंकि यह साफ तरीका है कि पायथन 3 में ऐसा कैसे किया जाए
विक्टर स्टिस्कला

2
@ scott654 मुझे लगा कि टिप्पणी की शुरुआत में यह सही हो गया, इससे यह स्पष्ट हो गया, लेकिन मैंने इसमें कुछ साहसिक भी जोड़ा।
टिम टिस्डल

1
मैं नोट को कोड ब्लॉक में एक टिप्पणी के रूप में बनाऊंगा क्योंकि हम सभी कोड को पहले उत्तरों में स्कैन करते हैं और यदि कोड अच्छा लगता है तो केवल बाकी को पढ़ें। हालांकि अच्छा जवाब।
मैथ्यू Purdon

2
स्थानीय समय अस्पष्ट हो सकता है । उदाहरण ( datetime.now()) खराब है, क्योंकि यह भोली डेटाइम वस्तुओं के उपयोग को प्रोत्साहित करता है जो स्थानीय समय का प्रतिनिधित्व करते हैं और यह डीएसटी संक्रमण (अंतर्निहित अस्पष्टता के कारण) के दौरान विफल हो सकते हैं। आप ts = datetime.now(timezone.utc).timestamp()इसके बजाय उपयोग कर सकते हैं ।
JFS

@JFSebastian - अच्छी बात है। मैं आयात में जोड़ना नहीं चाहता था, हालाँकि, मैंने इसे बदल दिया utcnow()। मैं उन मशीनों पर काम करने के लिए उपयोग किया जाता हूं जहां टाइमज़ोन UTC के लिए सेट है, लेकिन इस कोड स्निपेट में ऐसा नहीं होना चाहिए।
टिम टिस्डाल

139

बस यह मिल गया, और यह भी छोटा है।

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)

12
इस सवाल का जवाब नहीं है।
जेसी ढिल्लों

22
@JesseDhillon यह सवाल का जवाब देता है (भविष्य में UNIX टाइमस्टैम्प 5 मिनट करें), बस शीर्षक नहीं।
dbr

3
time.time()वापस सेट किया जा सकता है। भविष्य में "एक्सपायर" मान 5 मिनट बनाने के लिए आपको time.monotonic()अपने उपयोग-मामले के आधार पर एनालॉग की आवश्यकता हो सकती है ।
JFS

@ jf-sebastian time.monotonic () एक UNIX टाइमस्टैम्प वापस नहीं करता है, यह एक अपरिभाषित संदर्भ बिंदु के साथ टाइमस्टैम्प लौटाता है।
rspeer

@rspeer: हाँ, जैसा कि डॉक्स कहते हैं , केवल लगातार कॉल के बीच का अंतर वैध है। क्या monotonicउपयोग किया जा सकता है यह आपके उपयोग-मामले पर निर्भर करता है उदाहरण के लिए, subprocessमॉड्यूल इसका उपयोग timeoutविकल्प को लागू करने के लिए करता है।
JFS

57

यह वही चीज़ है जिसकी आपको आवश्यकता है:

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())

यह कैसे अलग है या जो 'कैट प्लस प्लस' प्रदान करता है?
डेविड

3
ईजी यह सवाल "यूथ टाइमस्टैम्प के लिए पायथन डेटटाइम" का जवाब है, जबकि कैट प्लस प्लस ने "पायथन डेटटाइम जो कि यूनिक्स टाइमस्टैम्प में 5 मिनट में होगा" सवाल का जवाब दिया। तो यह एक साफ और स्पष्ट है।
रनिंग।

@ रनिंग। टी: यह मुझे याद दिलाता है: "हर समस्या का सरल, स्पष्ट और गलत समाधान है"। संभव मुद्दों के साथmktime(dt.timetuple()) देखें ।datetime.now(timezone.utc).timestamp()@Tim Tisdall द्वारा प्रदान किया गया पायथन 3.3+ में समाधान है। अन्यथा (dt - epoch).total_seconds()उपयोग किया जा सकता है
jfs

@JFSebastian क्या होगा अगर मैं वास्तव में स्थानीय समय में सभी गणना करना चाहता हूं? क्या यह मामला है जब जैसे। एक भोले स्ट्रिंग को पार्स करने के लिए, जो जानता है कि स्थानीय समय है और तय करें कि क्या उस विशेष समय में डीएसटी प्रभावी था?
n611x007

1
@ नक्सा: हाँ, कुछ स्थानीय समय अस्पष्ट या अस्तित्वहीन हैं। इसके अलावा डीएसटी के अलावा अन्य कारणों से टाइमज़ोन ऑफ़सेट अलग हो सकते हैं (आपको सही ऑफसेट का पता लगाने के लिए पाइत्ज़ जैसे tz डेटाबेस की आवश्यकता है)। स्थानीय समय का मतलब है कि स्थानीय राजनीतिज्ञ जो भी सोचते हैं वह समय को मापने के लिए एक अच्छा विचार है, यह अत्यधिक अनियमित हो सकता है।
JFS

48

आप प्रारूप स्ट्रिंग datetime.strftimeका उपयोग करके युग में समय प्राप्त करने के लिए उपयोग कर सकते हैं %s:

def expires():
    future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
    return int(future.strftime("%s"))

नोट: यह केवल लिनक्स के तहत काम करता है, और यह विधि टाइमज़ोन के साथ काम नहीं करती है।


32
यह कुछ हद तक अनिर्दिष्ट व्यवहार है ( python.org/doc/current/library/datetime.html )। लगता है कि linux के तहत काम किया जा रहा है और win32 (जनरेटिंग ValueError: Invalid format string) के तहत काम नहीं कर रहा है ।
एंटनी हैचकिंस

3
यह विधि टाइमज़ोन के साथ काम नहीं करती है। समय-क्षेत्र बदलने से समान परिणाम डेटाइम (2013,12,7, tzinfo = timezone ("अमेरिका / अमेरिका")) देगा। स्ट्रैफ़ाइम ("% s") 1386385200 डेटाटाइम (2013,12,7, tininfo = timezone ("यूरोप /") रीगा "))। स्ट्रैफ़ाइम ("% s ") 1386385200
मार्टिंस

11

यहाँ एक कम टूटा- datetimeफूटा समाधान है जिसे डेटाइम टाइम से पॉज़िक्स टाइमस्टैम्प में परिवर्तित किया जा सकता है:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()

पाइथन में UTC टाइमस्टैम्प पर डेटाटाइमटाइम में परिवर्तित करने के लिए अधिक विवरण देखें ।



4

कुंजी यह सुनिश्चित करने के लिए है कि आपके द्वारा उपयोग की जाने वाली सभी तिथियां utc timezone में हैं इससे पहले कि आप कनवर्ट करना शुरू करें। Http://pytz.sourceforge.net/ देखेंकैसे ठीक से करने के लिए जानने के लिए । Utc को सामान्य करके, आप दिन के उजाले की बचत की अस्पष्टता को समाप्त करते हैं। फिर आप यूनिक्स युग से दूरी की गणना करने के लिए सुरक्षित रूप से टाइमडेल्टा का उपयोग कर सकते हैं, और फिर सेकंड या मिलीसेकंड में परिवर्तित कर सकते हैं।

ध्यान दें कि परिणामस्वरूप यूनिक्स टाइमस्टैम्प स्वयं यूटीसी टाइमज़ोन में है। यदि आप स्थानीय समयक्षेत्र में टाइमस्टैम्प देखना चाहते हैं, तो आपको एक और रूपांतरण करने की आवश्यकता होगी।

यह भी ध्यान दें कि यह केवल 1970 के बाद की तारीखों के लिए काम करेगा।

   import datetime
   import pytz

   UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0, tzinfo = pytz.utc)
   def EPOCH(utc_datetime):
      delta = utc_datetime - UNIX_EPOCH
      seconds = delta.total_seconds()
      ms = seconds * 1000
      return ms

3
नोट: मुझे समझ नहीं आया "[यूनिक्स] टाइमस्टैम्प एक स्थानीय समय क्षेत्र में"। टाइमस्टैम्प समान है (बीता हुआ सेकंड 1970-01-01 00:00:00+00:00)। स्थानीय समय-क्षेत्र में एक भोलीdatetime.fromtimestamp(ts)
भाली

4

निम्नलिखित ऊपर दिए गए उत्तरों पर आधारित है (साथ ही मिलीसेकंड के लिए एक सुधार) और टाइमज़ोन datetime.timestamp()का उपयोग करने पर 3.3 से पहले पायथन 3 के लिए अनुकरण करता है।

def datetime_timestamp(datetime):
    '''
    Equivalent to datetime.timestamp() for pre-3.3
    '''
    try:
        return datetime.timestamp()
    except AttributeError:
        utc_datetime = datetime.astimezone(utc)
        return timegm(utc_datetime.timetuple()) + utc_datetime.microsecond / 1e6

पूछे गए सवाल का सख्ती से जवाब देने के लिए, आप चाहेंगे:

datetime_timestamp(my_datetime) + 5 * 60

datetime_timestampसिंपल-डेट का हिस्सा है । लेकिन अगर आप उस पैकेज का उपयोग कर रहे हैं तो आप शायद टाइप करेंगे:

SimpleDate(my_datetime).timestamp + 5 * 60

जो my_datetime के लिए कई और प्रारूप / प्रकारों को संभालता है।


क्या आपको 5 मिनट जोड़ने के लिए (5 * 60) नहीं जोड़ना चाहिए? मुझे लगता है कि टाइमस्टैम्प में केवल 5 को जोड़ने से केवल 5 सेकंड जुड़ते हैं।
टिम टिस्डल

1
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue

1

ध्यान दें कि timedelta.total_seconds()अजगर-2.7 + पर काम के साथ समाधान । calendar.timegm(future.utctimetuple())पायथन के निचले संस्करणों के लिए उपयोग करें ।

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