Cara terbersih dan paling Pythonic untuk mendapatkan tanggal besok?

120

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.

linkmaster03
sumber

Jawaban:

241

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

Kamil Szot
sumber
39

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)
Mark Rushakoff
sumber
7

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
PaulMcG
sumber
time.strftimemenangani detik kabisat: lihat Catatan 2: docs.python.org/library/time.html#time.strftime dan Catatan 3: docs.python.org/library/datetime.html#strftime-behavior
Mark Rushakoff
Ini karena waktu Unix tidak menangani detik kabisat. Lihat en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/[email protected]/msg00094.html , dan POSIX itu sendiri.
"setiap hari akan dihitung dengan tepat 86400 detik" opengroup.org/onlinepubs/9699919799/basedefs/…
Tahun kabisat menjelaskan perbedaan antara tahun matahari dan 365 hari, sementara detik kabisat pada dasarnya berbeda dan menjelaskan perbedaan yang disebabkan oleh faktor eksternal seperti gempa bumi. Ini membuat mereka tidak teratur dan tidak dapat ditentukan dengan cara yang sama seperti, misalnya menentukan hari dalam seminggu dimana 3 Maret 2055 akan mendarat.
David Woods
1
@DavidWoods: detik kabisat adalah menjaga UTC dalam waktu +/- 0,9 detik dari UT1 (rotasi Earth). Ada 25 detik kabisat yang diakumulasi dari tahun 1972 hingga 2012. Gempa bumi terlalu lemah untuk menyebabkannya ( satu gempa bumi dapat menyebabkan perubahan mikrodetik - seribu kali lebih kecil dari perbedaan milidetik tipikal dalam durasi hari dari 86400 SI detik ).
jfs
5

Bahkan timemodul dasar dapat menangani ini:

import time
time.localtime(time.time() + 24*3600)
u0b34a0f6ae
sumber
1
Ini gagal pada batas Waktu Musim Panas di Amerika Serikat, karena pada batas tersebut satu hari akan memiliki 23 jam dan satu hari akan memiliki 25 jam. Ini juga tidak memperhitungkan detik kabisat.
Charles Wood
@CharlesWood: jawaban ini mungkin mengembalikan jam yang berbeda yang (dalam beberapa zona waktu) berarti mungkin mengembalikan tanggal yang berbeda (bukan besok) tetapi selalu mengembalikan waktu yang tepat 24 jam ke depan (jawaban yang diterima kembali tengah malam (jam tidak diketahui dari sekarang )). Saya tidak melihat bagaimana detik kabisat dapat mengubah hasil di sini kecuali dipanggil selama detik kabisat pada sistem di mana 23:59:60 dan 00:00:00 memiliki stempel waktu yang sama.
jfs
Benar, itu akan selalu menjadi 24 jam dari sekarang, tapi bukan itu pertanyaannya. OP ingin tahu bagaimana mendapatkan kencan besok . Hal detik kabisat itu hanya nitpicking;)
Charles Wood
@CharlesWood: ya. Saya baru saja mengklarifikasi bahwa itu tidak kembali 23, 25 jam. Dan ya, ini mungkin mengembalikan tanggal yang salah (bukan besok, misalnya, untuk "2014-10-18 23:00:00" di zona waktu "Brasil / Timur"). Terkait: Mengingat waktu saat ini di UTC, bagaimana Anda menentukan waktu mulai dan akhir hari dalam zona waktu tertentu? .
jfs
@JFSebastian Benar, saya hanya mencoba menunjukkan bahwa hari-hari tidak selalu 24 jam . Tidak heran bekerja dengan tanggal begitu sulit; bahkan sulit untuk berkomunikasi tentang mereka: /
Charles Wood