如何在Python中获取文件的ctime和/或mtime,包括时区?

时间:2015-06-09 11:19:03

标签: python datetime timezone

根据我提到的这个相关的questionanswer,很明显Python 3.4中的datetime.fromtimestamp(os.path.getctime())没有返回时区感知的日期时间对象。但是,基于某些调查,我还发现HFS +文件系统上的OS X 10.9(例如)似乎维护时区和ctimes(除非gls从我的本地时区推断时区和夏令时时间):

$ gls -l --full-time -c

-rw-------  1 myuser staff 538 2015-01-04 17:12:57.000000000 +0100 fileone
-rwxr-xr-x 17 myuser staff 578 2015-05-20 06:41:07.000000000 +0200 filetwo

(我正在使用the GNU version of ls

如何从ctime获取时区并将其插入/组合到日期时间对象中?

(我也喜欢mtime的相同答案,我认为它会类似)。

3 个答案:

答案 0 :(得分:4)

ctime和mtime都可用作“自纪元以来的秒数”(由time.time()返回的值)。

要获取本地时区,您可以使用tzlocal module

#!/usr/bin/env python
import os
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal

local_timezone = get_localzone()
aware_dt = datetime.fromtimestamp(os.path.getctime(path), local_timezone)

您可能会看到时区信息,因为ls使用本地时区将时间戳转换为相应的故障时间和时区偏移量。

答案 1 :(得分:1)

如果您只想依赖Python标准库,则只能使用tzinfo的时区子类:

tz = datetime.timezone(datetime.timedelta(seconds=-time.timezone), time.tzname[0]) \
    if (time.daylight == 0 || time.localtime(os.path.getctime(path)).tm_isdst == 0) \
    else datetime.timezone(datetime.timedelta(seconds=-time.altzone), time.tzname[1])
dt = datetime.fromtimestamp(os.path.getctime(path), tz)

然后你可以(在法国):

>>> dt
datetime.datetime(2015, 6, 9, 13, 43, 3, 791255, tzinfo=datetime.timezone(datetime.timedelta(0, 7200), 'Paris, Madrid (heure d\x92été)'))
>>> dt.utctimetuple()
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=9, tm_hour=11, tm_min=43, tm_sec=3, tm_wday=1, tm_yday=160, tm_isdst=0)

当然,mtime的工作方式完全相同

您应该咨询J.F. Sebastian's post以获取参考。这是一个摘录:

要以解决time.daylight问题的方式获取当前UTC偏移量,即使tm_gmtoff不可用,也可以使用[this]:

import time
from datetime import datetime

ts = time.time()
utc_offset = (datetime.fromtimestamp(ts) -
              datetime.utcfromtimestamp(ts)).total_seconds()

答案 2 :(得分:0)

这对我有用:

import os, datetime, time

modified_time = os.path.getmtime(file)
mtime_obj = datetime.datetime(*time.localtime(modified_time)[:6])
# (or)
mtime_obj = datetime.datetime.fromtimestamp(modified_time)
print(mtime_obj.strftime('%Y-%m-%d_%H-%M-%S'))

没有外部包裹。只是标准的python库。 (Python 3.6)