【问题标题】:Converting str into datetime and fetching all data from db将字符串转换为日期时间并从数据库中获取所有数据
【发布时间】:2020-12-11 15:28:12
【问题描述】:

我尝试创建一个 tasks.loop() 来检查需要取消静音的静音用户,但是这样做时有一些问题,由于某种原因我不能使用 fetchall() 因为它会给我这个错误

toremove = muteremove[2]
IndexError: list index out of range

如果我使用 fetchone() 可能它每 10 秒只获取 1 个用户,我的意思是如何每 10 秒获取所有数据以取消静音用户? 另外,如果我使用 fetchone(),它会说它can't convert str into datetime.datetime object,我该如何解决这个问题?

    @tasks.loop(seconds=10)
    async def muted_user_check(self):
        self.cur.execute(f"SELECT userId, guildId, expiredAt FROM mutedlist")
        muteremove = self.cur.fetchall()
        if muteremove is None:
            print("No user to unmute :D")
        if muteremove is not None:
            toremove = muteremove[2]
            timenow = datetime.utcnow()
            if timenow > toremove:
                self.cur.execute(f"DELETE FROM mutedlist WHERE guildId = {muteremove[1]} and userId = {muteremove[0]}")

【问题讨论】:

    标签: sqlite discord discord.py discord.py-rewrite


    【解决方案1】:

    要将字符串转换为日期时间对象,可以使用strptime() 方法:

    from datetime import datetime
    
    def convert(date, format):
        return datetime.strptime(date, format)
    
    [input] convert('22/08/2020', '%d/%m/%Y')
    [output] 2020-08-22 00:00:00
    

    输出将是一个日期时间对象,您可以使用strftime() 方法对其进行格式化,如下所示:

    #Example
    from datetime import datetime
    
    now = datetime.now() #now will be a datetime object
    now.strftime('%d/%m/%Y - %H:%M:%S') # DD/MM/YYYY - hours:minutes:seconds
    

    以下是一些格式的列表:

    • %A → 工作日(%a 表示缩写,%w 表示数字)
    • %-d → 挂载日期 (1, 2, 3, 4, ...)
    • %B → 山名(%b 表示缩写,%-m 表示数字)
    • %I → 小时(12 小时制)
    • %p → 上午或下午
    • %H → 小时(24 小时制)
    • %M → 分钟
    • %S → 秒
    • %f → 微秒
    • %c → 本地日期和时间表示

    使用您的代码,它将是:

    @tasks.loop(seconds=10)
    async def muted_user_check(self):
        self.cur.execute(f"SELECT * FROM mutedlist")
        mute_list = self.cur.fetchall()
        if not mute_list:
            print("No user to unmute :D")
        else:
            timeNow = datetime.utcnow()
            for mute in mute_list:
                muteExpire = datetime.strptime(mute[3], '%Y-%m-%d %H:%M:%S')
                if timeNow > muteExpire :
                    self.cur.execute(f"DELETE FROM mutedlist WHERE guildId=? AND userId=?", (mute[0], mute[1]))
    

    【讨论】:

    • 所以如果我想格式化数据库中的日期时间,这是字符串,我需要做muteremove = self.cur.fetchone()convert('muteremove', '%d/%m/%Y')
    • 没用,但格式化的东西工作得很好。我可以通过不和谐与您联系吗:/
    • 我的昵称是 Mr_Spaar#0523
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多