首页 > 解决方案 > 将时间格式从“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)

标签: pythonjsondatetime-formaticalendartaskwarrior

解决方案


时间格式20210730T220000Z称为“ISO 8601 基本格式”

表示可以以两种格式之一完成 - 具有最少分隔符的基本格式或添加分隔符以增强人类可读性的扩展格式。

有 RFC3339 和 ISO8601 等不同的格式,这篇文章详细讨论了它们的关系。但是您看到的这个错误不是由于时区的存在(Z对于 UTC)。

Arrow 最近在v0.15中添加了支持:

[新] 现在支持日期和时间的 ISO 8601 基本格式(例如 YYYYMMDDTHHmmssZ)。

在撰写本文时,最新版本ics是 0.7(您可能正在使用)。它固定arrow到 <0.15,它直接解释并重现了您看到的错误。

要继续前进,您有几个选择:

  1. 手动处理日期时间格式解析,无论是使用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')
  2. 使用未发布的版本ics,它有新的发展,不再依赖于arrow. 如果更新ics不处理它,至少你可以自由使用最新的arrow包。
  3. 添加另一个您选择的日期时间解析库(pendulumdateutil等)。整个日期时间处理情况在 Python 中可能很混乱,但它们都倾向于与 stdlib 互操作datetime

推荐阅读