Преобразование строки unix timestamp в читаемую дату
У меня есть строка, представляющая себе UNIX-метку времени (например, "1284101485") в Python, и я хотел бы конвертировать её в читаемую дату. Когда я использую time.strftime
, я получаю ошибку TypeError
:
import time
print(time.strftime("%B %d %Y", "1284101485"))
Ошибка выглядит так:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
Как правильно преобразовать строку с UNIX-временем в читаемую дату без получения этой ошибки?
5 ответ(ов)
Для преобразования метки времени в объект datetime
в Python вы можете использовать модуль datetime
. Пример кода приведен ниже:
from datetime import datetime
ts = int('1284101485')
# Если вы столкнетесь с ошибкой "year is out of range", то метка времени может быть в миллисекундах.
# В этом случае попробуйте `ts /= 1000`
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
Этот код сначала импортирует класс datetime
из модуля datetime
, а затем создаёт целочисленную переменную ts
с меткой времени. Затем используется метод utcfromtimestamp
, чтобы преобразовать метку времени в UTC и отобразить её в формате 'ГГГГ-ММ-ДД ЧЧ:ММ:СС'. Если метка времени указана в миллисекундах, вам нужно будет разделить её на 1000, чтобы избежать ошибки "год вне диапазона".
Чтобы преобразовать временную метку в объект datetime
в Python, вы можете использовать метод fromtimestamp()
из модуля datetime
. Вот пример кода, который вы привели:
from datetime import datetime
timestamp = 1172969203.1
dt = datetime.fromtimestamp(timestamp)
print(dt)
Результат выполнения этого кода будет:
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Это означает, что временная метка 1172969203.1
соответствует дате и времени: 4 марта 2007 года, 00:46:43.100000. Обратите внимание, что вы можете использовать временные метки в формате UNIX (количество секунд с 1 января 1970 года) для работы с датами и временем в вашем приложении.
Самый популярный ответ предлагает использовать метод fromtimestamp
, который подвержен ошибкам, так как он использует локальную временную зону. Чтобы избежать проблем, лучше использовать UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
Где posix_time
— это время в формате Posix эпохи, которое вы хотите конвертировать.
Этот вопрос состоит из двух частей:
- Преобразовать unix-метку времени ("секунды с начала эпохи") в местное время.
- Отобразить местное время в нужном формате.
Портативный способ получить местное время, который работает даже если в прошлом у местного часового пояса был другой UTC-смещение, а Python не имеет доступа к базе данных временных зон, - это использовать часовой пояс pytz
:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # $ pip install tzlocal
unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # получаем часовой пояс pytz
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)
Чтобы отобразить это время, вы можете использовать любой формат времени, поддерживаемый вашей системой, например:
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y")) # выводим дату в вашем формате
Если вам не нужно местное время, а нужно получить читаемое UTC-время, сделайте так:
utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))
Если вам не важны проблемы с часовыми поясами, которые могут повлиять на возвращаемую дату, или если Python имеет доступ к базе данных временных зон на вашей системе:
local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))
В Python 3 вы можете получить объект даты и времени с учетом часового пояса, используя только стандартную библиотеку (UTC-смещение может быть неверным, если Python не имеет доступа к базе данных временных зон на вашей системе, например, на Windows):
#!/usr/bin/env python3
from datetime import datetime, timezone
utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
Функции из модуля time
представляют собой тонкие оболочки вокруг соответствующего C API, и поэтому они могут быть менее портативными, чем соответствующие методы datetime
, однако их тоже можно использовать:
#!/usr/bin/env python
import time
unix_timestamp = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time))
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))
Ваша задача заключается в конвертации временной метки в читаемый формат. Вы можете использовать модуль time
в Python для выполнения этой задачи.
Вот пример того, как преобразовать временную метку в строку с датой и временем:
import time
# Преобразуем временную метку в читаемый формат
timestamp = int("1284101485")
readable_time = time.ctime(timestamp)
print(readable_time) # Вывод: 'Fri Sep 10 16:51:25 2010'
# Форматируем время согласно заданному шаблону
formatted_time = time.strftime("%D %H:%M", time.localtime(timestamp))
print(formatted_time) # Вывод: '09/10/10 16:51'
В этом коде time.ctime()
превращает временную метку в строку, описывающую дату и время, а time.strftime()
позволяет вам задать формат вывода, например, "дата/месяц/год часы:минуты".
Вывод первого вызова будет: 'Fri Sep 10 16:51:25 2010'
, а второго: '09/10/10 16:51'
.
Существует ли список временных зон Pytz?
Как преобразовать datetime в date?
Получение текущей даты в формате YYYY-MM-DD в Python
Как получить день недели по заданной дате?
Как конвертировать секунды в часы, минуты и секунды?