将时间格式从“20210730T220000Z”转换为格式“2021-07-30T00:00”

convert time format from '20210730T220000Z' to the format '2021-07-30T00:00'

我正在使用 taskwarrior 作为任务管理器,并希望使用 python(ics 包)以 .icsfformat (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,它直接解释并重现了您所看到的错误。

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

  1. 手动处理日期时间格式解析,无论是使用 arrowdateutildatetime,正如@mrkrieger1 已经建议的那样。 ics 给了我们 convenient escape hatcharrow
    e.begin = task['scheduled'], 'YYYYMMDDTHHmmssZ'
    
    这对应于 two string parameter form,例如arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')
  2. 使用未发布版本的ics,它有新的发展,不再依赖于arrow。如果较新的 ics 无法处理,至少您可以免费使用最新的 arrow 软件包。
  3. 添加您选择的另一个日期时间分析库(pendulumdateutil 等)。 Python 中的整个日期时间处理情况可能很混乱,但它们都倾向于与 stdlib datetime.
  4. 互操作