Biorąc pod uwagę datetime.time
wartość w Pythonie, czy istnieje standardowy sposób dodania do niej liczby całkowitej w sekundach, tak aby na przykład 11:34:59
+ 3 = 11:35:02
?
Te oczywiste pomysły nie działają:
>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
Na koniec napisałem takie funkcje:
def add_secs_to_time(timeval, secs_to_add):
secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
secs += secs_to_add
return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
Nie mogę jednak nie myśleć, że brakuje mi łatwiejszego sposobu na zrobienie tego.
Odpowiedzi:
Możesz używać pełnych
datetime
zmiennych ztimedelta
i, podając fikcyjną datę, a następnie używając,time
aby uzyskać wartość czasu.Na przykład:
daje dwie wartości w odstępie trzech sekund:
Możesz również wybrać bardziej czytelny
jeśli jesteś taki skłonny.
Jeśli szukasz funkcji, która może to zrobić, możesz skorzystać z
addSecs
poniższych:To daje:
źródło
Jak powiedzieli inni tutaj, możesz po prostu używać pełnych obiektów data-godzina w:
Myślę jednak, że warto wyjaśnić, dlaczego wymagane są pełne obiekty typu data-godzina. Zastanów się, co by się stało, gdybym dodał 2 godziny do 23:00. Jakie jest prawidłowe zachowanie? Wyjątek, ponieważ nie możesz mieć czasu dłuższego niż 23:59? Czy powinien się zawinąć?
Różni programiści będą oczekiwać różnych rzeczy, więc każdy wybrany przez nich wynik zaskoczy wielu ludzi. Co gorsza, programiści pisali kod, który działał dobrze, gdy testowali go początkowo, a następnie mieli zepsuć się, robiąc coś nieoczekiwanego. Jest to bardzo złe, dlatego nie wolno dodawać obiektów timedelta do obiektów czasu.
źródło
Jedna drobiazg, może dodać jasności, aby zastąpić domyślną wartość na kilka sekund
źródło
Dzięki @Pax Diablo, @bvmou i @Arachnid za sugestię korzystania z pełnych czasów danych w całym tekście. Jeśli muszę zaakceptować obiekty datetime.time z zewnętrznego źródła, wydaje się, że jest to
add_secs_to_time()
funkcja alternatywna :Ten pełny kod można skompresować do tego jednowierszowego:
ale myślę, że i tak chciałbym to zawrzeć w funkcji zapewniającej przejrzystość kodu.
źródło
Jeśli warto dodać kolejny plik / zależność do twojego projektu, właśnie napisałem małą małą klasę, która rozszerza się
datetime.time
o umiejętność wykonywania arytmetyki. Kiedy minie północ, zawija się wokół zera. Teraz, „Która będzie godzina, za 24 godziny” ma wiele narożnych skrzynek, w tym czas letni, sekundy przestępne, historyczne zmiany stref czasowych i tak dalej. Ale czasami naprawdę potrzebujesz prostej skrzynki i tak właśnie się stanie.Twój przykład zostałby napisany:
nptime
dziedziczy podatetime.time
, więc każda z tych metod również powinna być użyteczna.Jest dostępny w PyPi jako
nptime
(„czas nie pedantyczny”) lub w GitHub: https://github.com/tgs/nptimeźródło
Nie można po prostu dodać liczby,
datetime
ponieważ nie jest jasne, która jednostka jest używana: sekundy, godziny, tygodnie ...Istnieje
timedelta
klasa manipulacji z datą i godziną.datetime
minusdatetime
dajetimedelta
,datetime
plustimedelta
dajedatetime
,datetime
nie można dodać dwóch obiektów, chociaż dwatimedelta
mogą.Utwórz
timedelta
obiekt za pomocą ilu sekund chcesz dodać i dodaj go dodatetime
obiektu:Jest sama koncepcja w C ++
std::chrono::duration
.źródło
Dla kompletności, oto sposób, aby to zrobić
arrow
(lepsze daty i godziny dla Pythona):źródło
Spróbuj dodać a
datetime.datetime
dodatetime.timedelta
. Jeśli chcesz tylko przedziału czasu, możesz wywołaćtime()
metodę na wynikowymdatetime.datetime
obiekcie, aby go uzyskać.źródło
Stare pytanie, ale pomyślałem, że wprowadzę funkcję obsługującą strefy czasowe. Kluczowe części przekazują atrybut
datetime.time
obiektutzinfo
do łączenia, a następnie używajątimetz()
zamiasttime()
wynikowego atrapy danych. Ta odpowiedź częściowo zainspirowana innymi odpowiedziami tutaj.A oto bardzo prosta klasa przypadków testowych (przy użyciu wbudowanego
unittest
):źródło