Python timedelta收到意想不到的结果

时间:2011-10-31 09:25:18

标签: python datetime methods time timedelta

在我正在为现有数据库编写的Web应用程序中,我需要计算now和存储在数据库中的时间戳之间的差异(在文本字段中,它是愚蠢的,我知道)。这是我的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 个答案:

答案 0 :(得分:2)

如果您想获得timenow之间的秒数,请使用

remaining.days * 24 * 3600 + remaining.seconds 而不只是remaining.seconds

答案 1 :(得分:1)

输出被搞砸了,因为将数秒转换为天,小时,分钟和秒的计算是错误的。既然你没有发布那些我能说的代码,但请注意,一天有86400秒,你输出的所有秒数都小于此。

您输出的小时,分​​钟和秒的值看起来很好,只是您计算的天数是错误的。