11

Преобразование строки unix timestamp в читаемую дату

11

У меня есть строка, представляющая себе 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 ответ(ов)

15

Для преобразования метки времени в объект 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, чтобы избежать ошибки "год вне диапазона".

3

Чтобы преобразовать временную метку в объект 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 года) для работы с датами и временем в вашем приложении.

2

Самый популярный ответ предлагает использовать метод fromtimestamp, который подвержен ошибкам, так как он использует локальную временную зону. Чтобы избежать проблем, лучше использовать UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Где posix_time — это время в формате Posix эпохи, которое вы хотите конвертировать.

0

Этот вопрос состоит из двух частей:

  1. Преобразовать unix-метку времени ("секунды с начала эпохи") в местное время.
  2. Отобразить местное время в нужном формате.

Портативный способ получить местное время, который работает даже если в прошлом у местного часового пояса был другой 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))  
0

Ваша задача заключается в конвертации временной метки в читаемый формат. Вы можете использовать модуль 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'.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь