Как узнать, покрывают ли две даты ровно один день (проблемы летнего времени) - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть фрагмент кода, который предоставил две Python datetime (s) с поддержкой часовых поясов, чтобы выяснить, являются ли они точно началом и концом одного и того же дня.

В большинстве случаев проверка того, что разница (timedelta) между двумя датами составляет 23 hours, 59 minutes, 59 seconds and 999999 microseconds, работает нормально:

from datetime import datetime, time, timedelta, date
import pytz
ny = pytz.timezone('America/New_York')

day=date(2019, 3, 11)

start_naive=datetime.combine(day, time.min)
start=ny.localize(start_naive)

end_naive=datetime.combine(day, time.max)
end=ny.localize(end_naive)

same_day_check = timedelta(hours=time.max.hour, 
                           minutes=time.max.minute, 
                           seconds=time.max.second, 
                           microseconds=time.max.microsecond)

print(f"Same day?")
(end - start) == same_day_check # This outputs True

⚠️ Однако .. .

В дни перехода на летнее время день не длится 23 часа 59 минут. 59 se c. и 999999 микросекунд, но +1 час или -1 час (в эти даты "день" может длиться 22 часа, 59 минут .. или 24 часа, 59 минут ...):

# ...

day=date(2019, 3, 10)  # DST start in NY timezone

# ...

same_day_check = timedelta(hours=time.max.hour, 
                           minutes=time.max.minute, 
                           seconds=time.max.second, 
                           microseconds=time.max.microsecond)

print(f"Same day?")
(end - start) == same_day_check # Now this is `False`
print(end-start) # This outputs 22:59:59.999999

Is Есть ли более надежный способ, чем этот? Использование timedelta, как описано выше, явно не является надежным решением.

...