सबसे साफ और सबसे पायथोनिक तरीका कल की तारीख पाने के लिए?


120

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

जवाबों:



39

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)

7

छलांग सेकंड के कोई हैंडलिंग नहीं :

>>> 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'

रफ़ू।

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

>>> 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 द्वारा लौटाए गए मूल्य को ले जाएगा और मुझे मूल ट्यूपल को वापस दे दिया, 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

time.strftimeलीप सेकंड्स हैंडल करें: नोट 2 देखें: docs.python.org/library/time.html#time.strftime और नोट 3: docs.python.org/library/datetime.html#strftime-behavior
मार्क अहाकॉफ

ऐसा इसलिए है क्योंकि यूनिक्स समय लीप सेकंड नहीं संभालता है। देखें en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html , और POSIX ही।

"प्रत्येक और हर दिन बिल्कुल 86400 सेकंड के लिए हिसाब किया जाएगा" opengroup.org/onlinepubs/9699919799/basedefs/…

लीप वर्ष में सौर वर्ष और यहां तक ​​कि 365 दिनों के बीच अंतर होता है, जबकि लीप सेकंड स्वाभाविक रूप से अलग होते हैं और भूकंप जैसे बाहरी कारकों के कारण अंतर होते हैं। यह उन्हें अनियमित बनाता है और उसी तरह से निर्धारित नहीं किया जा सकता है, जैसे कि 3 मार्च, 2055 को सप्ताह के दिन का निर्धारण।
डेविड वुड्स

1
@ डेविडवूड्स: लीप सेकंड्स यूटी 1 (यूटी रोटेशन) से +/- 0.9 सेकंड के भीतर यूटीसी रखने के लिए हैं। 1972 से 2012 तक 25 लीप सेकंड्स जमा हुए हैं। भूकंप के कारण यह बहुत कमजोर है ( एक भी भूकंप माइक्रोसेकंड परिवर्तन शुरू कर सकता है - 86400 सेकंड से दिन की अवधि में एक विशिष्ट मिलीसेकंड अंतर से हजार गुना कम )।
jfs

5

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

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

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

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

सच है, यह अब से हमेशा 24 घंटे होगा, लेकिन यह सवाल नहीं था। ओपी जानना चाहता था कि कल की तारीख कैसे मिलेगी । लीप सेकंड की बात सिर्फ नाइटपैकिंग थी;)
चार्ल्स वुड

@CharlesWood: हाँ। मैंने अभी स्पष्ट किया है कि यह २३, २५ घंटे में वापस नहीं आता है। और हाँ, यह गलत तिथि (कल नहीं जैसे, "2014-10-18 23:00:00" के लिए "ब्राज़ील / ईस्ट" टाइमज़ोन) में वापस आ सकता है। संबंधित: यूटीसी में वर्तमान समय को देखते हुए, आप किसी विशेष समय-क्षेत्र में दिन की शुरुआत और समाप्ति समय का निर्धारण कैसे करते हैं?
jfs

@ जेएफएसबेस्टियन राइट, मैं सिर्फ यह बताना चाह रहा था कि दिन हमेशा 24 घंटे लंबे नहीं होते । कोई आश्चर्य नहीं कि तिथियों के साथ काम करना इतना मुश्किल है; उनके बारे में संवाद करना भी मुश्किल है: /
चार्ल्स वुड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.