Python timedelta получает неожиданные результаты - PullRequest
4 голосов
/ 31 октября 2011

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

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 нужен простой способ сортировкиЭто.Проблема, с которой я сталкиваюсь, состоит в том, что целые числа и строки не совпадают, как вы можете видеть на этом скриншоте здесь:

example html table

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

отредактируйте

для записи в верхней части скриншота отметки времени 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

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

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

remaining.days * 24 * 3600 + remaining.seconds вместо просто remaining.seconds

1 голос
/ 31 октября 2011

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

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

...