Python中的ISO时间(ISO 8601)
我有一个文件。在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库。