我有一个文件。在Python中,我想创建它的时间,并将其转换为ISO time (ISO 8601) string,同时保留它在东部时区中创建的事实。Python中的ISO时间(ISO 8601)?
如何把文件的ctime但其转换为ISO时间字符串时,这表明东部时区(并考虑到夏令时,如果需要的话)?
我有一个文件。在Python中,我想创建它的时间,并将其转换为ISO time (ISO 8601) string,同时保留它在东部时区中创建的事实。Python中的ISO时间(ISO 8601)?
如何把文件的ctime但其转换为ISO时间字符串时,这表明东部时区(并考虑到夏令时,如果需要的话)?
你需要使用os.stat
来获取文件的创建时间和格式time.strftime
和time.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()
到localtime()
。
是否帐户时区夏令时时间?无论夏令时间与否,tz似乎都是一样的。 – 2010-01-29 06:30:28
这将是无论什么抵消现在生效。如果DST处于活动状态,它将与DST不在时的偏移量不同。 – 2010-01-29 06:35:59
纠正我,如果我错了(我不是),但从UTC的偏移更改与夏令时。所以,你应该用
tz = str.format('{0:+06.2f}', float(time.altzone)/3600)
我也相信的,该标志应为不同
tz = str.format('{0:+06.2f}', -float(time.altzone)/3600)
我可能是错的,但我不这么认为
我亚雷克同意,并我还注意到ISO偏移分隔符是冒号,因此我认为最终答案应该是:
isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone)/3600).replace('.', ':')
ISO 8601时间表示
国际标准ISO 8601描述了日期和时间的字符串表示法。这种格式的两个简单的例子是
2010-12-16 17:22:15
20101216T172215
(两者代表2010年12月16),但格式还允许亚秒级解决时间和指定的时区。这种格式当然不是Python特定的,但它适用于以便携式格式存储日期和时间。有关此格式的详细信息可以在Markus Kuhn entry
找到我建议你使用这种格式来存储时间在文件中。获得当前时间在此表示
一种方法是在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)
个参考
什么感觉是“更强大”? – 2017-07-29 19:10:17
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
我发现datetime.isoformat在doc;似乎做你想要什么:
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'
你能解释你如何得到正确的timedelta? – 2016-01-20 13:47:56
本地到ISO-8601:
import datetime
datetime.datetime.now().isoformat()
UTC到ISO-8601:
import datetime
datetime.datetime.utcnow().isoformat()
本地到ISO-8601无微秒:
import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
UTC to ISO-8601 with TimeZone info(蟒蛇3):
import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
本地到ISO-8601与时区信息(蟒蛇3):
import datetime, time
# calculate the offset taking into account daylight saving time
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset_sec)).isoformat()
对于Python 2,查看和使用pytz
'.isoformat()'可以带一个分隔符参数,(如果你想要的东西不是'T'):'.isoformat('')' – ThorSummoner 2016-08-24 23:21:27
@ThorSummoner很高兴知道!但要注意,更换分隔符不再符合ISO-8601标准......这是没有道理的(此外,还有更好的方法来打印日期,但这里不是问题)。 [RFC](https://tools.ietf.org/html/rfc3339#section-5.6) – estani 2016-08-25 07:48:01
允许空间作为ISO-8601标准的一部分。 '允许通过双方同意省略'T'字符。' – raychi 2016-09-07 19:52:16
ISO8601 time format不存储时区名称,只保留相应的utc偏移量。
要将文件的ctime转换为ISO 8601时间字符串,同时保留UTC在Python 3偏移:
>>> 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'
的代码假定您的本地时区是东部时区和您的系统提供了一个正确的UTC给定POSIX时间戳的偏移量(ts
),即python可以访问系统上的历史时区数据库,或者时区在给定日期有相同的规则。
如果您需要便携式解决方案; use pytz
module提供访问the tz database:
>>> 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的时间格式的一部分。这不是唯一的。
不同的库/不同版本的同一个库的可能使用不同的时区规则同一日期/时区。如果它是未来的日期,那么规则可能还未知。换句话说,同样的UTC时间可以对应不同的本地时间取决于什么样的规则,你用 - 在ISO8601格式保存时间保持UTC时间和对应于当前时区规则在使用你的平台上的本地时间。如果规则不同,您可能需要重新计算不同平台上的本地时间。
这里是我用来转换为XSD日期时间格式:
from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your iso string
我碰到这个问题,寻找XSD日期时间格式的时候来了。我需要从isoformat
中删除微秒。干杯!
我已经开发了这一功能:?如何将ISO 8601日期字符串转换成一个Python的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
的
可能重复(http://stackoverflow.com/questions/969285/如何做 - 我 - 翻译 - 一个ISO - 8601 - 日期时间字符串到一个python - 日期时间对象) – 2010-06-13 10:57:36
@尼克 - 有用的链接,但不是重复 - 他问的转换方式。 – Yarin 2011-12-19 03:54:51
@ Joseph-我刚才问这个的问候RFC 3999-应该对这项工作 - [生成Python中的RFC 3339时间戳(http://stackoverflow.com/q/8556398/165673) – Yarin 2011-12-19 03:59:39