我有一个文件 . 在Python中,我想花费它的创建时间,并将其转换为ISO time (ISO 8601) string while preserving the fact that it was created in the Eastern Time Zone (ET) .
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑夏令时)?
我有一个文件 . 在Python中,我想花费它的创建时间,并将其转换为ISO time (ISO 8601) string while preserving the fact that it was created in the Eastern Time Zone (ET) .
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑夏令时)?
11 回答
ISO 8601本地:
UTC至ISO 8601:
本地到ISO 8601没有微秒:
带有TimeZone信息的UTC到ISO 8601(Python 3):
带有TimeZone信息的本地ISO 8601(Python 3):
对于Python 2,请参阅并使用pytz .
我在the documentation找到了datetime.isoformat . 它似乎做你想要的:
ISO 8601 Time Representation
国际标准ISO 8601描述了日期和时间的字符串表示 . 这种格式的两个简单例子是
(两者均代表2010年12月16日),但格式也允许亚秒级分辨率时间并指定时区 . 这种格式当然不是特定于Python的,但它适合以便携式格式存储日期和时间 . 有关此格式的详细信息,请参见Markus Kuhn entry .
我建议使用此格式在文件中存储时间 .
在此表示中获取当前时间的一种方法是使用Python标准库中time模块的strftime:
您可以使用datetime类的strptime构造函数:
最强大的是Egenix mxDateTime模块:
References
The Python time module documentation
The Python datetime class documentation
The Egenix mxDateTime class
这是我用来转换为XSD日期时间格式的内容:
在查找XSD日期时间格式(
xs:dateTime
)时,我遇到了这个问题 . 我需要从isoformat
中删除微秒 .ISO 8601 time format不存储时区名称,仅保留相应的UTC偏移量 .
要将文件ctime转换为ISO 8601时间字符串,同时在Python 3中保留UTC偏移量:
该代码假定您的本地时区为Eastern Time Zone(ET),并且您的系统为给定的POSIX时间戳(
ts
)提供了正确的UTC偏移量,即,Python可以访问系统上的历史时区数据库,或者时区具有相同的时区在给定日期的规则 .如果您需要便携式解决方案; use the pytz module提供对the tz database的访问:
在这种情况下结果是相同的 .
如果您需要时区名称/缩写/区域ID,请单独存储 .
注意:否,UTC偏移中的
:
和EST
时区缩写不是ISO 8601时间格式的一部分 . 它不是唯一的 .同一库的不同库/不同版本可以对同一日期/时区使用不同的时区规则 . 如果是未来日期,则规则可能尚未知晓 . 换句话说,相同的UTC时间可能对应于不同的本地时间,具体取决于您使用的规则 - 以ISO 8601格式保存时间可保留UTC时间以及与您平台上使用的当前时区规则相对应的本地时间 . 如果具有不同的规则,您可能需要在不同的平台上重新计算本地时间 .
您需要使用
os.stat
来获取文件创建时间以及time.strftime
和time.timezone
的组合以进行格式化:如果我错了(我不是),请纠正我,但UTC的偏移会随着夏令时而变化 . 所以你应该使用
我也相信标志应该是不同的:
我错了,但我不这么认为 .
我同意Jarek,而且我还注意到ISO偏移分隔符是一个冒号,所以我认为最终的答案应该是:
ISO 8601允许紧凑的表示,除了
T
之外没有分隔符,所以我喜欢使用这个单行来获取快速时间戳字符串:如果您不需要微秒,请忽略
.%f
部分:当地时间:
我开发了这个功能: