将时间格式从"20210730T220000Z"转换为格式"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 = 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,它直接解释并再现了您所看到的错误。

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

  1. 手动处理日期时间格式解析,无论是使用arrowdateutil还是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中,整个日期时间处理情况可能很混乱,但它们都倾向于与stdlibdatetime互操作

相关内容

最新更新