将字符串转换为日期时间并从数据库中获取所有数据

Converting str into datetime and fetching all data from db

我尝试制作一个 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]}")

要将字符串转换为日期时间对象,可以使用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]))