我有一个档案。在Python中,我希望将其创建时间转换为ISO时间(ISO 8601)字符串,同时保留它是在东部时区(ET)创建的事实。
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑日光节约时间)?
我有一个档案。在Python中,我希望将其创建时间转换为ISO时间(ISO 8601)字符串,同时保留它是在东部时区(ET)创建的事实。
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑日光节约时间)?
当前回答
下面是我用来转换为XSD日期时间格式的:
from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string
我在寻找XSD日期时间格式(xs:dateTime)时遇到了这个问题。我需要从等值格式中删除微秒。
其他回答
我开发了这个函数:
def iso_8601_format(dt):
"""YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""
if dt is None:
return ""
fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
tz = dt.utcoffset()
if tz is None:
fmt_timezone = "+00:00"
else:
fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))
return fmt_datetime + fmt_timezone
ISO 8601时间表示
国际标准ISO 8601描述了日期和时间的字符串表示形式。这种格式的两个简单示例是
2010-12-16 17:22:15
20101216T172215
(两者都代表2010年12月16日),但该格式还允许亚秒级的分辨率时间和指定时区。这种格式当然不是python特有的,但它很适合以可移植的格式存储日期和时间。关于这种格式的详细信息可以在Markus Kuhn的条目中找到。
我建议使用这种格式在文件中存储时间。
在这种表示中获取当前时间的一种方法是使用Python标准库中的time模块中的strftime:
>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'
你可以使用datetime类的strptime构造函数:
>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)
最健壮的是Egenix mxDateTime模块:
>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)
参考文献
Python时间模块文档 Python datetime类文档 Egenix mxDateTime类
我同意Jarek的观点,而且我还注意到ISO偏移分隔符字符是冒号,所以我认为最终的答案应该是:
isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')
本地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.utcnow().replace(tzinfo=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
注意,在utc时间上使用astimezone()时有一个错误。这给出了一个错误的结果:
datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result
对于Python 2,请参阅并使用pytz。
如果我错了请纠正我(我没有),但是与UTC的偏移量随着夏令时的变化而变化。所以你应该使用
tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)
我也相信星座应该有所不同:
tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)
我可能是错的,但我不这么认为。