Apa cara terbersih dan paling Pythonic untuk mendapatkan tanggal besok? Pasti ada cara yang lebih baik daripada menambahkan satu hari, menangani hari di akhir bulan, dll.
Apa cara terbersih dan paling Pythonic untuk mendapatkan tanggal besok? Pasti ada cara yang lebih baik daripada menambahkan satu hari, menangani hari di akhir bulan, dll.
Jawaban:
datetime.date.today() + datetime.timedelta(days=1)
harus melakukan triknya
timedelta
dapat menangani penambahan hari, detik, mikrodetik, milidetik, menit, jam, atau minggu.
>>> 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)
Seperti yang ditanyakan dalam komentar, hari kabisat tidak menimbulkan masalah:
>>> 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)
Tidak ada penanganan detik kabisat :
>>> 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'
menisik.
EDIT - @Mark: Dokumen mengatakan "ya", tetapi kodenya mengatakan "tidak terlalu banyak":
>>> 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)
Saya akan berpikir bahwa gmtime atau localtime akan mengambil nilai yang dikembalikan oleh mktime dan memberi saya kembali tupel asli, dengan 60 sebagai jumlah detik. Dan tes ini menunjukkan bahwa detik kabisat ini bisa menghilang begitu saja ...
>>> 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
Bahkan time
modul dasar dapat menangani ini:
import time
time.localtime(time.time() + 24*3600)
time.strftime
menangani detik kabisat: lihat Catatan 2: docs.python.org/library/time.html#time.strftime dan Catatan 3: docs.python.org/library/datetime.html#strftime-behavior