Альтернатива datetime.datetime.strftime () для вырезания ненужных единиц времени - PullRequest
0 голосов
/ 16 сентября 2018

Я бы хотел сравнить два времени даты с точным выводом строки, таким как «3 часа, 2, минуты, 46 секунд». Теперь, скажем, у меня есть два объекта datetime в UTC, мне нужно, чтобы они могли быть произвольной суммой, но при этом обрезать ненужные значения. Пример:

>>> import datetime
>>> date1 = datetime.datetime.now()
>>> date2 = datetime.datetime.fromtimestamp(123456789)
>>> date2 - date1
datetime.timedelta(-16362, 59566, 655021)

Теперь я могу просто использовать datetime.datetime.strftime() в качестве продолжения, но с широким диапазоном значений, с которыми я могу столкнуться (от 1 секунды до месяцев), я хочу обрезать ненужные значения и избегать «0 месяцев, 0 недель ...» так далее." и «1 час, 0 минут, 0 секунд» без округления (значения всегда положительные). Есть ли эффективный способ динамически сделать это, чтобы показать только соответствующие значения времени? Я просмотрел другие вопросы, похожие на Как мне найти разницу во времени между двумя объектами datetime в python? , но ни один из них полностью не ответил на мой вопрос, и я не могу понять его самостоятельно после многих часов работы.

1 Ответ

0 голосов
/ 17 сентября 2018

Вопрос : ... сделать это, чтобы показывать только подходящие значения времени?

Следующее реализует ваши собственные class Timedelta:

class Timedelta(object):
    def __init__(self, td):
        self._td = td

        def _calc(s, f):
            _s = int(s % f)
            return _s, int(s / f)

        s, self.hours = _calc(self._td.seconds, (60 * 60))
        self.seconds, self.minutes = _calc(s, 60)

    def __str__(self):
        r = ""
        for v in [('Days', self._td.days), ('Hours', self.hours), ('Minutes', self.minutes), ('Seconds', self.seconds)]:
            if v[1] != 0:
                lingua = v[0]
                if v[1] == 1: lingua = v[0][:-1]
                r += "{} {} ".format(v[1], lingua)
        return  r

    def __repr__(self):
        return "({}) Days:{} Hours:{} Minutes:{} Seconds:{}"\
            .format((self._td.seconds), self._td.days, self.hours, self.minutes, self.seconds)

Использование :

date1 = dt.datetime(2018, 9, 17, hour=18, minute=23, second=0)
date2 = dt.datetime(2018, 9, 17, hour=22, minute=23, second=10)
dtt = date2 - date1
print("dtt:{}".format(dtt))

tdelta = Timedelta(date2 - date1)
print("Timedelta::\__repr\__: {}".format(tdelta.__repr__()))
print("Timedelta::\__str\__: {}".format(tdelta))

Выход :

dtt: 4: 00: 10
Timedelta :: __ repr__: (14410) Дни: 0 Часы: 4 минуты: 0 Секунды: 10
Timedelta: __ str__: 4 Часы 10 секунд

Протестировано с Python: 3.4.2

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