将ISO 8601日期时间转换为适用于Jira的日期时间格式

3
JIRA REST API对日期和时间字符串有一些特殊要求,它并不完全符合ISO 8601标准。
例如:
ISO兼容的日期时间: 2023-06-25T20:32:13+00:00 Jira兼容的日期时间: 2023-06-25T20:32:13.00+0000 以下是使ISO格式与Jira兼容的两个更改:
  1. 时区偏移以[+-]hhmm的形式表示,而不是ISO格式的[+-]hh:mm
  2. 即使小数部分为0,也需要包含小数秒(例如2023-06-25T20:32:13+0000不被接受,而2023-06-25T20:32:13.00+0000被接受)。
下面的Python代码可以生成Jira兼容的值,但是否有更加Pythonic的方法或者是否有一些库可以帮助我实现这个功能呢?
import datetime

planned_finish_date = (datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=5)).isoformat(sep='T', timespec='seconds')

planned_finish_date = planned_finish_date.rsplit("+", 1)[0] + ".00+" + planned_finish_date.rsplit("+", 1)[1].replace(":", "")


看起来这是一个被忽视了5年的错误。其中一个建议的修复方法是parse($date_value).strftime('%Y-%m-%dT%H:%M:%S.000+0000') - Panagiotis Kanavos
看起来这是一个被忽视了5年的错误。其中一个建议的修复方法是parse($date_value).strftime('%Y-%m-%dT%H:%M:%S.000+0000') - Panagiotis Kanavos
1个回答

0
IIUC,你需要ISO格式(RFC3339),但是要求必须有毫秒级的小数部分,并且在UTC偏移的小时和分钟之间没有冒号(参见Kanavos Panagiotis的评论)。
假设你的输入字符串保证有一个UTC偏移(指定了时区),我会选择一个不同的timespec(毫秒或微秒)来使用isoformat,然后切片字符串以去除最后一个冒号。
from datetime import datetime, timezone

now_iso = datetime.now(timezone.utc).isoformat(timespec="microseconds")
print(now_iso)
# 2023-06-26T05:52:25.134221+00:00

now_jira = now_iso[:-3] + now_iso[-2:]
print(now_jira)
# 2023-06-26T05:52:25.134221+0000

请注意,只有在您能够确定一个UTC偏移量的情况下,这才是一种安全的方法,例如通过确保datetime对象的tzinfo属性不为None。
dt = datetime.now(timezone.utc)
assert dt.tzinfo is not None, "must use timezone-aware datetime"

# then
now_iso = dt.isoformat(timespec="microseconds")
now_jira = now_iso[:-3] + now_iso[-2:]

@PanagiotisKanavos谢谢你的评论;抱歉,我对JIRA不熟悉。所以,如果我理解正确,他们遵循JSON约定,但是我认为RFC3339在UTC偏移中包括了冒号? - FObersteiner
@PanagiotisKanavos谢谢评论;抱歉,我对JIRA不熟悉。所以,如果我理解正确,他们遵循JSON约定,然而我认为RFC3339在UTC偏移中包括冒号? - FObersteiner
@PanagiotisKanavos 感谢您的评论;抱歉,我对JIRA不熟悉。据我了解,他们遵循JSON约定,但是我认为RFC3339在UTC偏移中包括了冒号。 - undefined
1
我的评论是错误的。我没有注意到偏移量。猜猜我的脑子没法看到这么明显的错误。这是一个已知的bug,已经存在了5年多!其中一个解决方法就是忽略小数秒 parse($date_value).strftime('%Y-%m-%dT%H:%M:%S.000+0000') - Panagiotis Kanavos
1
我的评论是错误的。我没有注意到偏移量。猜猜我的脑海里看不见这么明显的错误。这是一个已知的 bug,已经存在了五年多!其中一个解决方法就是忽略小数秒 parse($date_value).strftime('%Y-%m-%dT%H:%M:%S.000+0000') - Panagiotis Kanavos
1
我的评论错了。我没有注意到偏移量。猜猜我的脑子没法看到这么明显的错误。这是一个已知的 bug,已经存在了5年以上,但却没有被修复!其中一个解决方法就是忽略小数秒 parse($date_value).strftime('%Y-%m-%dT%H:%M:%S.000+0000') - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接