ISO时间(ISO 8601)在Python?

我有一个文件。 在Python中,我希望将其创build时间,并将其转换为ISO时间(ISO 8601)string, 同时保留它在东部时区创build的事实

如何获取文件的ctime并将其转换为ISO时间string,表示东部时区(如果需要,还考虑夏时制)?

本地到ISO-8601:

import datetime datetime.datetime.now().isoformat() 

UTC到ISO-8601:

 import datetime datetime.datetime.utcnow().isoformat() 

我在doc中find了datetime.isoformat; 似乎做你想做的事情:

 datetime.isoformat([sep]) Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example, >>> >>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... def utcoffset(self, dt): return timedelta(minutes=-399) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' 

ISO 8601时间表示

国际标准ISO 8601描述了date和时间的string表示。 这种格式的两个简单的例子是

 2010-12-16 17:22:15 20101216T172215 

(两者都代表2010年12月16日),但格式也允许亚秒级解决时间和指定时区。 这种格式当然不是Python特有的,但是它以便携格式存储date和时间。 关于这种格式的细节可以在Markus Kuhn条目中find

我build议使用这种格式来存储文件中的时间。

获得当前时间的一种方法是使用Python标准库中时间模块的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的date时间类文档

  • Egenix mxDateTime类

这是我用来转换为XSDdate时间格式:

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

我在查找XSDdate时间格式时遇到了这个问题。 我需要从isoformat删除微秒。 干杯!

ISO8601时间格式不存储时区名称,只保留相应的utc偏移量。

要将文件ctime转换为ISO 8601时间string,同时保留Python 3中的utc偏移量:

 >>> import os >>> from datetime import datetime, timezone >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, timezone.utc) >>> dt.astimezone().isoformat() '2015-11-27T00:29:06.839600-05:00' 

该代码假设您的本地时区是东部时区,并且您的系统为给定的POSIX时间戳( ts )提供了正确的UTC偏移量,即,python可以访问系统上的历史时区数据库,或者时区具有相同的规则一个给定的date。

如果您需要便携式解决scheme; 使用提供访问tz数据库的 pytz模块 :

 >>> import os >>> from datetime import datetime >>> import pytz # pip install pytz >>> ts = os.path.getctime(some_file) >>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York')) >>> dt.isoformat() '2015-11-27T00:29:06.839600-05:00' 

结果在这种情况下是相同的。

如果您需要时区名称/缩写/区域ID; 将其分开存储。

 >>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)') '2015-11-27 00:29:06-0500 (EST)' 

注意:否: utc偏移量和EST时区缩写不是ISO8601时间格式的一部分。 这不是独一无二的。

不同的库/相同库的不同版本可能在同一个date/时区使用不同的时区规则。 如果这是一个未来的date,那么规则可能是未知的。 换句话说,相同的UTC时间可能对应于不同的本地时间,具体取决于您使用的规则 – 以ISO8601格式保存时间会保留UTC时间以及与当前在您的平台上使用的时区规则相对应的本地时间。 如果规则不同,则可能需要重新计算不同平台上的本地时间。

您需要使用os.stat来获取文件创build时间以及time.strftimetime.timezone格式的组合:

 >>> import time >>> import os >>> t = os.stat('C:/Path/To/File.txt').st_ctime >>> t = time.localtime(t) >>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t) >>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600) >>> final = formatted + tz >>> >>> final '2008-11-24 14:46:08-02.00' 

编辑:gmtime()切换到gmtime() localtime()

纠正我,如果我错了(我不是),但从UTC的偏移更改与夏令时。 所以你应该使用

 tz = str.format('{0:+06.2f}', float(time.altzone) / 3600) 

我也相信,标志应该是不同的

 tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600) 

我可能是错的,但我不这么认为

我同意Jarek,而且我还注意到ISO偏移分隔符是冒号,所以我认为最后的答案应该是:

 isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':') 

我已经开发了这个function:

 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 
 import datetime, time def convert_enddate_to_seconds(self, ts): """Takes ISO 8601 format(string) and converts into epoch time.""" dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 return seconds >>> import datetime, time >>> ts = '2012-09-30T15:31:50.262-08:00' >>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') >>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 >>> seconds 1348990310.26