我使用taskwarrior作为任务管理器,并希望使用python(ics
包(在.ics
fformat(ICal(中将任务转换为日历的事件。
如果我运行以下代码:
from ics import Calendar, Event
import json
task1 = {'description': 'blabla', 'scheduled': '20210730T220000Z' }
task2 = {'description': 'blabla', 'scheduled': '2021-07-30T00:00' }
task = task1
if __name__ == "__main__":
c = Calendar()
print(task)
e = Event()
e.name = task['description']
e.begin = task['scheduled']
c.events.add(e)
它给了我一个错误:
arrow.parser.ParserError: Could not match input to any of ['YYYY-MM-DDTHH:mm'] on '20210730T220000Z'
如果我用task = task2
替换task = task1
是没有问题的。我怀疑ics
不支持带时区的JSON格式。有没有一种简单的方法/包可以将20210730T220000Z
转换为2021-07-30T00:00
格式?
编辑N°1在@mkrieger1的评论和链接之后,我尝试了以下操作,但没有成功:
import datetime
task1 = {'description': 'blabla', 'scheduled': '20210730T220000Z' }
task2 = {'description': 'blabla', 'scheduled': '2021-07-30T00:00' }
print(task1["scheduled"])
dt = datetime.datetime.strptime(task1["scheduled"], 'YYYY-MM-DDTHH:mm').strftime('YYYY-MM-DDTHH:mm')
print(dt)
编辑N°2:这终于奏效了:
import datetime
task1 = {'description': 'blabla', 'scheduled': '20210730T220000Z' }
task2 = {'description': 'blabla', 'scheduled': '2021-07-30T00:00' }
print(task1["scheduled"])
dt = datetime.datetime.strptime(task1["scheduled"], "%Y%m%dT%H%M%S%fZ")
print(dt)
时间格式20210730T220000Z
被称为"ISO 8601基本格式":
表示可以用两种格式之一完成——一种是带有最少分隔符的基本格式,另一种是添加分隔符以增强可读性的扩展格式。
有不同的格式,如RFC3339和ISO8601,本文详细讨论了它们之间的关系。但您看到的这个错误并不是由于存在时区(Z
表示UTC(。
Arrow最近在v0.15:中添加了支持
[新]现在支持日期和时间的ISO 8601基本格式(例如YYYYMMDDTHmssz(。
截至本文撰写之时,ics
的最新版本为0.7(您可能正在使用(。它将CCD_ 11引脚到<0.15,它直接解释并再现了您所看到的错误。
要继续前进,您有几个选项:
- 手动处理日期时间格式解析,无论是使用
arrow
、dateutil
还是datetime
,正如@mrkrieger1所建议的那样。ics
为我们提供了一个方便的arrow
逃生通道:
这对应于双字符串参数形式,例如e.begin = task['scheduled'], 'YYYYMMDDTHHmmssZ'
arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')
- 使用
ics
的未发布版本,该版本有新的发展,不再依赖于arrow
。如果更新的ics
无法处理它,至少您可以自由使用最新的arrow
包 - 添加另一个日期时间解析库(
pendulum
、dateutil
等(。在Python中,整个日期时间处理情况可能很混乱,但它们都倾向于与stdlibdatetime
互操作