python - 将时间格式从“20210730T220000Z”转换为“2021-07-30T00:00”格式
问题描述
我正在使用 taskwarrior 作为任务管理器,并希望.ics
使用 python(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
。我怀疑带有时区的 JSON 格式不受ics
. 有没有一种简单的方法/包来转换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 基本格式(例如 YYYYMMDDTHHmmssZ)。
在撰写本文时,最新版本ics
是 0.7(您可能正在使用)。它固定arrow
到 <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 中可能很混乱,但它们都倾向于与 stdlib 互操作datetime
。
推荐阅读
- case - Teradata 案例表达式和文本比较 <> 不工作
- php - 如何注销会话然后登录另一个会话?
- reactjs - Multiple Material UI AppBar CSS conflict Caused By Postion Prop
- java - JPA 继承 @EntityGraph 包括可选的子类关联
- echarts - Echarts - 双 YAsix 不能使用不同的最小值/最大值
- math - 如果两个条件为真,如何翻转数字的符号?
- javascript - 如何创建一个在环 x9 上运行的圆圈?Javascript?
- android - Android:获取切换按钮操作而不是选定的导航项
- php - php如何防止多个用户同时登录?
- r - 我怎样才能获得夏皮罗威尔克测试