将字符串转换为日期时间并从数据库中获取所有数据
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]))
我尝试制作一个 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]))