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.

Jawaban:


241

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


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)

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


Ini karena waktu Unix tidak menangani detik kabisat. Lihat en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.