У меня большая таблица времени unix и соответствующие временные интервалы. Строка 1 столбца 1 может быть 1538082000
а столбец 2 - America/New_York
, строка 2 может быть 1538083000
и America/Los_Angeles
. В каждом случае я нуждаюсь в них в формате времени, которое было бы для кого-то внутри этого часового пояса.
Например, в моем примере EDT (строка 1) я бы хотел, чтобы Sept 27, 2018 5:00:00PM EDT
а для строки 2 я хотел бы Sept 27, 2018 2:16:40PM PDT
.
Я сталкиваюсь с этим каждый раз, когда пытаюсь очистить данные и отобразить их в более дружественном формате для третьих сторон, и я никогда не мог найти особенно хороший способ сделать это.
Использование стрелки:
>>> import arrow
>>> utc = arrow.Arrow.fromtimestamp(1538082000)
>>> conv = utc.to('America/New_York')
>>> conv.format("MMM D, YYYY h:mm:ssA ") + conv.tzname()
Результаты: Sep 27, 2018 5:00:00PM EDT
Для вашего второго примера:
>>> from dateutil import tz
>>> t = arrow.Arrow.fromtimestamp(1538083000, tzinfo=tz.gettz("America/Los_Angeles"))
>>> t.format("MMM D, YYYY h:mm:ssA ") + t.tzname()
Результаты Sep 27, 2018 2:16:40PM PDT
.
Вы можете использовать первую форму, используя to
или вы можете передать tzinfo
в fromtimestamp
, как во втором примере. Лично я считаю, что первая форма выглядит чище.
Решение без использования стрелки.
from datetime import datetime
from pytz import timezone
def convert_time(timestamp, tz):
tzinfo = timezone(tz)
dt = datetime.fromtimestamp(timestamp)
fmt = "%b %d, %Y %-I:%M:%S%p "
return dt.astimezone(tzinfo).strftime(fmt) + tzinfo.tzname(dt)
>>> ts = "1538082000"
>>> tz = "America/New_York"
>>> convert_time(int(ts), tz)
>>> Sep 27, 2018 5:00:00PM EDT
>>> ts2 = "1538083000"
>>> tz2 = "America/Los_Angeles"
>>> convert_time(int(ts2), tz2)
>>> Sep 27, 2018 2:16:40PM PDT
Используйте datetime.strftime()
import datetime
t = 1538082000
dt = datetime.datetime.fromtimestamp(t)
formatted = dt.strftime("%b %d, %Y %H:%M:%S")
formatted
>>> Sep 28, 2018 07:00:00
Согласно документам, time.time() создает временную метку с UTC 1/1/1970. Таким образом, вы можете использовать эту информацию для добавления/вычитания часов в зависимости от часового пояса.
Например, Мельбурн/Сидней (UTC + 10: 00)
t = 1538082000
dt = datetime.datetime.fromtimestamp(t)
tz_dt = dt + datetime.timedelta(hours=10)
tz_dt.strftime("%b %d, %Y %H:%M:%S")
tz_dt
>>> 2018-09-28 17:00:00
Вот документы для strftime, которые помогут отформатировать ваш ответ.
fromtimestamp()
возвращает местное время на моем компьютере, поэтому в моем случае (на ноутбуке в CDT) ваш пример возвращает Sep 28, 2018 02:00:00
Используя %I
буду форматировать Hour в 12-hour time
, а %p
вернет AM/PM
.
Использование pytz
также может работать:
from datetime import datetime
import pytz
def convert_time(timestamp, tz):
eastern = pytz.timezone('UTC')
tzinfo = pytz.timezone(tz)
loc_dt = eastern.localize(datetime.utcfromtimestamp(timestamp))
fmt = "%b %d, %Y %I:%M:%S%p %Z"
return loc_dt.astimezone(tzinfo).strftime(fmt)
ts = "1538082000"
tz = "America/New_York"
print(convert_time(int(ts), tz))
>> Sep 28, 2018 05:00:00PM EDT
ts = "1538083000"
tz = "America/Los_Angeles"
print(convert_time(int(ts), tz))
>> Sep 28, 2018 02:16:40PM PDT