Najczystszy i najbardziej Pythonowy sposób na ustalenie jutrzejszej randki?

120

Jaki jest najczystszy i najbardziej Pythonowy sposób na wyznaczenie jutrzejszej randki? Musi być lepszy sposób niż dodawanie jednego do dnia, zajmowanie się dniami pod koniec miesiąca itp.

linkmaster03
źródło

Odpowiedzi:

241

datetime.date.today() + datetime.timedelta(days=1) powinien załatwić sprawę

Kamil Szot
źródło
39

timedelta może obsługiwać dodawanie dni, sekund, mikrosekund, milisekund, minut, godzin lub tygodni.

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

Jak pytano w komentarzu, dni przestępne nie stanowią problemu:

>>> 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
źródło
7

Brak obsługi sekund przestępnych, chociaż:

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

cerować.

EDYCJA - @Mark: Dokumenty mówią „tak”, ale kod mówi „nie tak bardzo”:

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

Myślę, że gmtime lub localtime weźmie wartość zwróconą przez mktime i zwróci mi oryginalną krotkę z 60 jako liczbą sekund. Ten test pokazuje, że te sekundy przestępne mogą po prostu zniknąć ...

>>> 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
źródło
time.strftimeobsługuje sekundy przestępne: patrz Uwaga 2: docs.python.org/library/time.html#time.strftime i Uwaga 3: docs.python.org/library/datetime.html#strftime-behavior
Mark Rushakoff
Dzieje się tak, ponieważ czas Unix nie obsługuje sekund przestępnych. Zobacz en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/[email protected]/msg00094.html i samą POSIX.
"każdy dzień będzie rozliczany przez dokładnie 86400 sekund" opengroup.org/onlinepubs/9699919799/basedefs/ ...
Lata przestępne uwzględniają różnicę między rokiem słonecznym a równymi 365 dniami, podczas gdy sekundy przestępne są z natury różne i uwzględniają różnice spowodowane czynnikami zewnętrznymi, takimi jak trzęsienia ziemi. To sprawia, że ​​są nieregularne i nie można ich określić w taki sam sposób, jak np. Ustalenie dnia tygodnia, w którym wyląduje 3 marca 2055 r.
David Woods
1
@DavidWoods: sekundy przestępne mają na celu zachowanie czasu UTC w granicach +/- 0,9 sekundy od UT1 (obrót Ziemi). W latach 1972-2012 zgromadzono 25 sekund przestępnych. Trzęsienia ziemi są zbyt słabe, aby je wywołać ( pojedyncze trzęsienie ziemi może wprowadzić zmiany mikrosekundowe - tysiąc razy mniej niż typowa różnica milisekund w czasie trwania dnia od 86400 sekund SI ).
jfs
5

Nawet podstawowy timemoduł sobie z tym poradzi:

import time
time.localtime(time.time() + 24*3600)
u0b34a0f6ae
źródło
1
Nie udaje się to na granicach czasu letniego w Stanach Zjednoczonych, ponieważ w tych granicach jeden dzień będzie miał 23 godziny, a jeden dzień będzie miał 25 godzin. Nie uwzględnia to również sekund przestępnych.
Charles Wood
@CharlesWood: ta odpowiedź może zwrócić inną godzinę, co (w niektórych strefach czasowych) oznacza, że ​​może zwrócić inną datę (nie jutro), ale zawsze zwraca czas dokładnie 24 godziny do przodu (zaakceptowana odpowiedź zwraca północ (nieznane godziny od teraz )). Nie widzę, jak sekundy przestępne mogą zmienić tutaj wynik, chyba że są wywoływane podczas sekundy przestępnej w systemach, w których 23:59:60 i 00:00:00 mają ten sam znacznik czasu.
jfs
To prawda, zawsze będzie to za 24 godziny, ale nie o to chodziło. OP chciał wiedzieć, jak ustalić jutrzejszą randkę . Chodziło o sekundę przestępną;)
Charles Wood
@CharlesWood: tak. Właśnie wyjaśniłem, że nie zwraca 23, 25 godzin. I tak, może zwrócić nieprawidłową datę (nie jutro, np. „2014-10-18 23:00:00” w strefie czasowej „Brazylia / Wschód”). Powiązane: biorąc pod uwagę aktualny czas UTC, jak określić godzinę rozpoczęcia i zakończenia dnia w określonej strefie czasowej? .
jfs
@JFSebastian Racja, po prostu próbowałem wskazać, że dni nie zawsze mają 24 godziny . Nic dziwnego, że praca z datami jest taka trudna; trudno się o nich nawet zakomunikować: /
Charles Wood