Python中的ISO时间(ISO 8601)

664 投票
15 回答
736437 浏览
提问于 2025-04-15 18:34

我有一个文件。在Python中,我想获取这个文件的创建时间,并把它转换成一个ISO时间格式(ISO 8601)的字符串,同时保留它是在东部时间区(ET)创建的这个事实

我该如何获取文件的创建时间,并把它转换成一个表示东部时间区的ISO时间字符串(如果需要,还要考虑夏令时)呢?

15 个回答

81

这是我用来转换成XSD日期时间格式的方法:

from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string

我在寻找XSD日期时间格式(xs:dateTime)时遇到了这个问题。我需要从isoformat中去掉微秒部分。

121

ISO 8601 允许用一种紧凑的方式表示时间,除了 T 之外不需要其他分隔符,所以我喜欢用这一行代码快速获取时间戳字符串:

>>> datetime.datetime.now(datetime.UTC).strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'

如果你不需要微秒,可以直接去掉 .%f 这一部分:

>>> datetime.datetime.now(datetime.UTC).strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'

如果想要本地时间:

>>> datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=-5))).strftime("%Y-%m-%dT%H:%M:%S%:z")
'2018-09-05T14:09:03-05:00'

一般来说,我建议你保留标点符号。RFC 3339 推荐使用这种风格,因为如果大家都使用标点符号,就不会出现多个 ISO 8601 字符串因为标点而被分组排序的风险。所以,符合规范的字符串的一行代码是:

>>> datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%dT%H:%M:%SZ")
'2018-09-05T14:09:03Z'
1145

本地时间转换为ISO 8601格式:

import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748

UTC时间转换为ISO 8601格式:

import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856

本地时间转换为不带微秒的ISO 8601格式:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43

带时区信息的UTC时间转换为ISO 8601格式(Python 3):

import datetime
datetime.datetime.now(tz=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00

不带微秒的本地时区信息的UTC时间转换为ISO 8601格式(Python 3):

import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00

带时区信息的本地时间转换为ISO 8601格式(Python 3):

import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00

注意:在使用astimezone()处理UTC时间时会有一个bug,这会导致结果不正确:

datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result

对于Python 2,请查看并使用pytz库。

撰写回答