2009-10-01 10 views
67

कल की तारीख पाने के लिए सबसे साफ और सबसे पाइथोनिक तरीका क्या है? महीने के अंत में दिन के लिए एक जोड़ने के लिए की तुलना में, संभाल दिन, एक बेहतर तरीका होना चाहिए आदिकल की तारीख पाने के लिए सबसे साफ और सबसे पाइथोनिक तरीका?

उत्तर

133

datetime.date.today() + datetime.timedelta(days=1) चाल

30

timedelta दिनों, सेकंड, माइक्रोसेकंड, मिलीसेकंड जोड़ने संभाल कर सकते हैं करना चाहिए, मिनट, घंटे, या सप्ताह।

>>> import datetime 
>>> today = datetime.date.today() 
>>> today 
datetime.date(2009, 10, 1) 
>>> today + datetime.timedelta(days=1) 
datetime.date(2009, 10, 2) 
>>> datetime.date(2009,10,31) + datetime.timedelta(hours=24) 
datetime.date(2009, 11, 1) 

के रूप में एक टिप्पणी में पूछा, छलांग दिनों कोई समस्या पैदा:

>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1) 
datetime.date(2004, 2, 29) 
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2) 
datetime.date(2004, 3, 1) 
>>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1) 
datetime.date(2005, 3, 1) 
+0

यह लीप वर्ष संभालती ठीक? – Rook

+0

@ldigas: हाँ यह करता है। – nosklo

5

leap seconds यद्यपि का कोई हैंडलिंग:

>>> from datetime import datetime, timedelta 
>>> dt = datetime(2008,12,31,23,59,59) 
>>> str(dt) 
'2008-12-31 23:59:59' 
>>> # leap second was added at the end of 2008, 
>>> # adding one second should create a datetime 
>>> # of '2008-12-31 23:59:60' 
>>> str(dt+timedelta(0,1)) 
'2009-01-01 00:00:00' 
>>> str(dt+timedelta(0,2)) 
'2009-01-01 00:00:01' 

रफ़ू।

संपादित करें - @Mark: डॉक्स "हां", लेकिन कोड कहते हैं, "नहीं इतना":

>>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S") 
(2008, 12, 31, 23, 59, 60, 2, 366, -1) 
>>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")) 
1230789600.0 
>>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))) 
(2009, 1, 1, 6, 0, 0, 3, 1, 0) 
>>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))) 
(2009, 1, 1, 0, 0, 0, 3, 1, 0) 

मुझे लगता है कि gmtime या स्थानीयसमय mktime से लौट आए और मुझे दिया मूल्य ले जाएगा लगता होगा मूल tuple वापस, 60 सेकंड के साथ सेकंड के रूप में। और इस परीक्षण से पता चलता है कि इन छलांग सेकंड बस दूर नहीं हो पाती कर सकते हैं ...

>>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")) 
>>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")) 
>>> a,b 
(1230789600.0, 1230789600.0) 
>>> b-a 
0.0 
+0

'time.strftime' हैंडल लीप सेकंड: नोट 2 देखें: http://docs.python.org/library/time.html#time.strftime और नोट 3: http://docs.python.org/library/datetime .html # strftime-behavior –

+0

ऐसा इसलिए है क्योंकि यूनिक्स समय लीप सेकंड को संभाल नहीं करता है। Http://en.wikipedia.org/wiki/Unix_time#History, http://www.mail-archive.com/[email protected]/msg00094.html, और POSIX स्वयं देखें। –

+0

"प्रत्येक दिन हर 86400 सेकेंड के लिए जिम्मेदार होगा" http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15 –

4

यहां तक ​​कि बुनियादी time मॉड्यूल इस संभाल कर सकते हैं:

import time 
time.localtime(time.time() + 24*3600) 
+0

सभी – Greg

+0

में से अधिकांश सुरुचिपूर्ण समाधान यह संयुक्त राज्यों में डेलाइट सेविंग्स टाइम की सीमाओं में विफल रहता है, क्योंकि उन सीमाओं पर एक दिन में 23 घंटे होंगे और एक दिन में 25 घंटे होंगे। यह खाते में लीप सेकंड भी नहीं लेता है। –

+0

@ चार्ल्सवुड: यह उत्तर एक अलग घंटे लौटा सकता है (कुछ समय क्षेत्र में) का मतलब है कि यह ** ** अलग-अलग तारीख ** (कल नहीं) वापस कर सकता है लेकिन यह हमेशा 24 घंटे आगे का समय लौटाता है (स्वीकृत उत्तर मध्यरात्रि वापस आता है (अब से अज्ञात घंटे))। मैं नहीं देखता कि कैसे लीप सेकंड परिणाम को तब तक बदल सकते हैं जब तक सिस्टम पर लीप सेकेंड के दौरान नहीं कहा जाता है जहां 23:59:60 और 00:00:00 समान टाइमस्टैम्प होता है। – jfs

संबंधित मुद्दे