Pertanyaan Cara paling bersih dan paling Pythonic untuk mendapatkan kencan besok?


Apa cara paling bersih dan paling Pythonic untuk mendapatkan kencan besok? Harus ada cara yang lebih baik daripada menambahkan satu hari, menangani hari di akhir bulan, dll.


75
2017-10-01 22:45


asal


Jawaban:


datetime.date.today() + datetime.timedelta(days=1) harus melakukan trik


150
2017-10-01 22:49



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 diminta 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)

30
2017-10-01 22:49



Tidak ada penanganan detik kabisat tho:

>>> 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 kode mengatakan "tidak begitu 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 tuple asli, dengan 60 sebagai jumlah detik. Dan tes ini menunjukkan bahwa detik-detik kabisat ini bisa memudar ...

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

5
2017-10-01 23:45



Bahkan dasar time modul dapat menangani ini:

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

4
2017-10-01 23:58