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