我有一个档案。在Python中,我希望将其创建时间转换为ISO时间(ISO 8601)字符串,同时保留它是在东部时区(ET)创建的事实。
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑日光节约时间)?
我有一个档案。在Python中,我希望将其创建时间转换为ISO时间(ISO 8601)字符串,同时保留它是在东部时区(ET)创建的事实。
如何获取文件的ctime并将其转换为指示东部时区的ISO时间字符串(并在必要时考虑日光节约时间)?
当前回答
请让生活变得简单:
使用UTC时间 微秒 一行代码
f utcnow () {datetime。datetime。isoformat (): 3]) Z”
输出:
2022 - 02 - 25 - t02:08:40.684z
其他回答
本地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。
你需要使用操作系统。Stat来获取文件创建时间和时间的组合。时间和时间。用于格式化的时区:
>>> 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'
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
如果我错了请纠正我(我没有),但是与UTC的偏移量随着夏令时的变化而变化。所以你应该使用
tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)
我也相信星座应该有所不同:
tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)
我可能是错的,但我不这么认为。
ISO 8601允许一个紧凑的表示,除了T之外没有分隔符,所以我喜欢使用这一行程序来获得一个快速的时间戳字符串:
>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'
如果你不需要微秒,可以省略。%f部分:
>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'
当地时间:
>>> datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
'20180905T140903'
一般来说,我建议你不要使用标点符号。RFC 3339推荐这种风格,因为如果每个人都使用标点符号,就不会有像多个ISO 8601字符串在标点符号上被分组排序这样的风险。因此,一个符合规则的字符串的内衬将是:
>>> datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
'2018-09-05T14:09:03Z'