Проверьте, были ли секунды или микросекунды предоставлены в объекте datetime - PullRequest
3 голосов
/ 25 января 2020

Можно ли для объекта python datetime определить, были ли атрибуты времени включены во время создания объекта? В частности, я хотел бы знать, были ли указаны минуты, секунды или микросекунды.

Например, следующее:

from datetime import datetime
d = datetime(2020,1,24)
# datetime.datetime(2020, 1, 24, 0, 0)
d.microsecond
# 0

# ideally, if function "has_seconds()" did exist...
if not d.has_seconds():
     d = d.replace(second=59)

Я работаю над функцией, в которой я получаю объект datetime и мне нужно заполнить любую информацию, которая не была предоставлена ​​изначально. Однако datetime принимает значение 0 для всех атрибутов времени, которые не были предоставлены изначально. К сожалению, 0 действителен для часов, минут, секунд и микросекунд, поэтому я не могу использовать это для проверки.

Я использую Python 3.7, если это уместно.

1 Ответ

0 голосов
/ 25 января 2020

Это не будет возможно с экземпляром datetime.datetime. Как вы заметили, конструктор автоматически заполняет пропущенные значения 0. Кроме того, существуют другие способы создания экземпляра datetime.datetime за пределами его конструктора. Нет никакого значимого различия между экземплярами, созданными этими различными методами. Если они имеют одинаковую базовую стоимость, они эквивалентны и неразличимы по дизайну. Другими словами, модуль datetime разработан для того, чтобы активно препятствовать тому, что вы пытаетесь сделать.

Не зная больше о вашем конкретном сценарии использования c и о том, почему вам нужно такое поведение, трудно предложить альтернатива.

Однако, если у вас есть контроль над кодом, вызывающим вашу функцию, вам лучше всего определить и принять свой собственный datetime.datetime -подобный класс, который предлагает аналогичный конструктор, но который не имеет неявно заменить неуказанные значения на 0. Вызывающие вашу функцию должны будут передавать экземпляры вашего класса вместо datetime.datetime. После того как вы применили свою собственную логику «пропущенное значение» c, вы можете создать полностью заполненный объект datetime.datetime и продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...