Из stat().st_mtime в datetime?

Каков наиболее идиоматический/эффективный способ преобразования времени модификации, полученного из вызова stat(), в объект datetime? Я придумал следующее (python3):

from datetime import datetime, timedelta, timezone
from pathlib import Path

path = Path('foo')
path.touch()
statResult = path.stat()
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
modified = epoch + timedelta(seconds=statResult.st_mtime)
print('modified', modified)

Кажется, что это не так, и немного удивительно, что мне приходится жестко кодировать эпоху Unix. Есть ли более прямой путь?


person Travis Griggs    schedule 06.09.2016    source источник


Ответы (2)


Вы можете использовать datetime.datetime.fromtimestamp, т.е.

from datetime import datetime, timezone
...
stat_result = path.stat()
modified = datetime.fromtimestamp(stat_result.st_mtime, tz=timezone.utc)
print('modified', modified)
person Take_Care_    schedule 06.09.2016
comment
Чтобы было ясно, это альтернативный конструктор (classmethod) в datetime классе, а не функция datetime модуля. Поэтому, если у вас просто import datetime в верхней части файла, вам понадобится datetime.datetime.fromtimestamp(...). Кроме того, учитывая, что OP использует pathlib, а не os.path, это должно быть Path(<YOUR_PATH_HERE>).stat().st_mtime; они даже никогда не импортировали os, поэтому использование path.getmtime из os.path может немного сбивать с толку в контексте OP. - person ShadowRanger; 07.09.2016
comment
Я исправил его, чтобы показать дату и время, используемую дважды с импортом даты и времени. - person CashCow; 05.01.2017
comment
Это позволит получить объект datetime в вашей локали в Python. Время mtime, хранящееся в файловой системе, должно быть записано как UTC в секундах и наносекундах. - person CMCDragonkai; 10.10.2018
comment
@ShadowRanger прав, в этом ответе было немного неправильно, включая ссылку. - person flying sheep; 15.01.2021

Это работает для меня, если вам нужна читаемая строка:

import datetime
mtime = path.stat().st_mtime
timestamp_str = datetime.datetime.fromtimestamp(mtime).strftime('%Y-%m-%d-%H:%M')
person Sam Shleifer    schedule 22.08.2019
comment
Это ответ. - person WhyWhat; 09.04.2020