如何获取文件的ctime并将其转换为指示东部时间区域的ISO时间字符串(如果需要考虑夏令时)?
import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748
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
import datetime
datetime.datetime.now(tz=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00
import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00
import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00
astimezone()
将UTC时间转换为本地时间时存在一个错误。这会导致结果不正确。datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result
.isoformat()
可以接受一个分隔符参数,以便您可以使用除了默认的'T'之外的其他内容作为分隔符。例如:.isoformat(' ')
表示使用空格作为分隔符。 - ThorSummonerISO 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'
new Date().toISOString()
会生成类似于2019-02-23T04:02:04.051Z
的日期时间格式。 - Mzqutcnow()
替代 now()
。 - DollarAkshay这是我用来将日期时间转换为XSD日期时间格式的方法:
from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string
我在寻找XSD日期时间格式(xs:dateTime
)时遇到了这个问题。我需要从isoformat
中删除微秒。
xs:date
。 - sventechiexs:dateTime
。 - radtekISO 8601时间表示
国际标准ISO 8601描述了日期和时间的字符串表示形式。这种格式的两个简单示例为:
2010-12-16 17:22:15
20101216T172215
ISO 8601日期格式可以用来表示时间(均为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)
参考资料
2018-05-25T12:16:14+00:00
- loxaxs2018-05-25T12:16:14Z
- loxaxs20180525T121614Z
- loxaxsdatetime.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'
如果您正在寻找仅限于日期的解决方案,那么它就是:
import datetime
datetime.date.today().isoformat()
datetime.datetime.now().strftime("%Y-%m-%d)
- tommy.carstensenISO 8601 时间格式不保存时区名称,仅保留相应的 UTC 偏移量。
在 Python 3 中将文件 ctime 转换为 ISO 8601 时间字符串并保留 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'
代码假设您的本地时区为东部标准时间(ET),并且您的系统针对给定的POSIX时间戳(ts
)提供了正确的UTC偏移量,即Python可以访问系统上的历史时区数据库或在给定日期时区具有相同的规则。如果您需要一个可移植的解决方案,请使用pytz
模块,该模块提供访问tz数据库的功能:
>>> 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
时区缩写也不是ISO 8601时间格式的一部分。这不是唯一的。
不同的库/相同库的不同版本可能针对同一日期/时区使用不同的时区规则。如果是未来的日期,则可能还不知道规则。换句话说,相同的UTC时间可能对应于不同的本地时间,具体取决于使用的规则 - 以ISO 8601格式保存时间会保留UTC时间以及与您平台上正在使用的当前时区规则对应的本地时间。如果使用不同的规则,在不同的平台上可能需要重新计算本地时间。
您需要使用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'
请保持生活简单:
f"{datetime.datetime.utcnow().isoformat()[:-3]}Z"
输出结果:
2022-02-25T02:08:40.684Z
在LoRa应用中,我需要以此格式获取时间,下面是我的解决方案,希望能够帮到你:
from datetime import datetime
from time import strftime
# Get the current time in the format: 2021-03-20T16:51:23.644+01:00
def rfc3339_time_ms():
datetime_now = datetime.utcnow()
# Remove the microseconds
datetime_now_ms = datetime_now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]
# Add the timezone as "+/-HHMM", and the colon in "+/-HH:MM"
datetime_now_ms_tz = datetime_now_ms + strftime("%z")
rfc3339_ms_now = datetime_now_ms_tz[:-2] + ":" + datetime_now_ms_tz[-2:]
# print(f"Current time in ms in RFC-3339 format: {rfc3339_ms_now}")
return rfc3339_ms_now