将时间格式从“20210730T220000Z”转换为格式“2021-07-30T00:00”
convert time format from '20210730T220000Z' to the format '2021-07-30T00:00'
我正在使用 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 = task1
换成task = task2
就没有问题了。我怀疑 ics
不支持带时区的 JSON 格式。有没有简单的方法/包将 20210730T220000Z
转换为格式 2021-07-30T00:00
?
编辑 N°1
在 @mkrieger1 和 link 的评论之后,我尝试了以下但没有成功:
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 basic format":
Representations can be done in one of two formats – a basic format with a minimal number of separators or an extended format with separators added to enhance human readability.
有RFC3339、ISO8601等不同的格式,本文post详细讨论它们的关系。但是您看到的这个错误不是由于存在时区(UTC 为 Z
)造成的。
Arrow 最近在 v0.15 中添加了支持:
[NEW] ISO 8601 basic format for dates and times is now supported (e.g. YYYYMMDDTHHmmssZ).
latest version of ics
is 0.7(您可能正在使用),截至撰写本文时。
它 pins arrow
to <0.15,它直接解释并重现了您所看到的错误。
要继续前进,您有几个选择:
- 手动处理日期时间格式解析,无论是使用
arrow
、dateutil
、datetime
,正如@mrkrieger1 已经建议的那样。 ics
给了我们 convenient escape hatch 到 arrow
:
e.begin = task['scheduled'], 'YYYYMMDDTHHmmssZ'
这对应于 two string parameter form,例如arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')
- 使用未发布版本的
ics
,它有新的发展,不再依赖于arrow
。如果较新的 ics
无法处理,至少您可以免费使用最新的 arrow
软件包。
- 添加您选择的另一个日期时间分析库(
pendulum
、dateutil
等)。 Python 中的整个日期时间处理情况可能很混乱,但它们都倾向于与 stdlib datetime
. 互操作
我正在使用 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 = task1
换成task = task2
就没有问题了。我怀疑 ics
不支持带时区的 JSON 格式。有没有简单的方法/包将 20210730T220000Z
转换为格式 2021-07-30T00:00
?
编辑 N°1 在 @mkrieger1 和 link 的评论之后,我尝试了以下但没有成功:
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 basic format":
Representations can be done in one of two formats – a basic format with a minimal number of separators or an extended format with separators added to enhance human readability.
有RFC3339、ISO8601等不同的格式,本文post详细讨论它们的关系。但是您看到的这个错误不是由于存在时区(UTC 为 Z
)造成的。
Arrow 最近在 v0.15 中添加了支持:
[NEW] ISO 8601 basic format for dates and times is now supported (e.g. YYYYMMDDTHHmmssZ).
latest version of ics
is 0.7(您可能正在使用),截至撰写本文时。
它 pins arrow
to <0.15,它直接解释并重现了您所看到的错误。
要继续前进,您有几个选择:
- 手动处理日期时间格式解析,无论是使用
arrow
、dateutil
、datetime
,正如@mrkrieger1 已经建议的那样。ics
给了我们 convenient escape hatch 到arrow
:
这对应于 two string parameter form,例如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
. 互操作