Python timedelta получает неожиданные результаты

#python #datetime #methods #time #timedelta

#python #дата и время #методы #время #timedelta

Вопрос:

В веб-приложении, которое я пишу для существующей базы данных, мне нужно вычислить разницу между now и временной меткой, хранящейся в базе данных (в текстовом поле, это глупо, я знаю). Вот мой Ban класс sqlalchemy и соответствующий метод.

 class Ban(base):
    __tablename__= 'bans'

    id= Column('banID', Integer, primary_key=True)
    unban_timestamp= Column('UNBAN', Text)
    banned_steamid= Column('ID', Text, ForeignKey('rp_users.steamid'))
    banned_name= Column('NAME', Text)
    banner_steamid= Column('BANNER_STEAMID', Text, ForeignKey('rp_users.steamid'))
    banner_name= Column('BANNER', Text)
    reason= Column('REASON', Text)

    def unbanned_in(self, mode):
        if self.unban_timestamp == '0':
            return 'Never'
        else:
            now= datetime.datetime.utcnow()
            time= datetime.datetime.fromtimestamp(int(self.unban_timestamp))
            if now > time:
                return 'Expired'
            else:
                remaining= time - now
                if mode=='readable':
                    return remaining
                elif mode=='int':
                    return str(remaining.seconds).zfill(10)
 

Мне нужны как целочисленные, так и красивые строковые представления, потому что я буду представлять это в html-таблице, а javascript нужен простой способ сортировки. Проблема, с которой я сталкиваюсь, заключается в том, что целые числа и строки не совпадают, как вы можете видеть на этом скриншоте здесь:

пример HTML-таблицы

если кто-нибудь может понять, почему результат настолько испорчен, это было бы оценено по достоинству! если вам понадобится дополнительная информация, чтобы ответить на мой вопрос, я с радостью добавлю ее.

Редактировать

для записи в верхней части скриншота временная метка unbanned_in — это 1320247970 если я запускаю ее через свою функцию, это результат, который я получаю

 >>> ban = session.query(db.Ban).filter_by(id=3783).one()
>>> print ban.unbanned_in('int'), ban.unbanned_in('readable')
0000049044 2 days, 13:37:24.179045
 

Комментарии:

1. «так облажался»? Пожалуйста, уточните, что именно вы считаете «облажавшимся». Если есть какой-либо способ создать простой текстовый список значений (не снимок экрана), то это было бы очень ценно.

Ответ №1:

Если вы хотите получить количество секунд между time и now , используйте

remaining.days * 24 * 3600 remaining.seconds вместо того, чтобы просто remaining.seconds

Комментарии:

1. Спасибо, это исправлено!

Ответ №2:

Результат испорчен, потому что ваш расчет для преобразования количества секунд в дни, часы, минуты и секунды неверен. Поскольку вы не опубликовали этот фрагмент кода, это все, что я могу сказать, но обратите внимание, что в сутках 86400 секунд, и все количество секунд, которые вы выводите, меньше этого.

Значения, которые вы выводите для часов, минут и секунд, выглядят нормально, просто ваш расчет для дней неверен.

Комментарии:

1. строка return remaining — это то, что ее преобразует, это эффективно работает str(datetime.timedelta)