Отображение времени Unix в определенном часовом поясе в формате AM / PM в Python - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть большая таблица времени 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.

Я часто сталкиваюсь с этим, когда пытаюсь почистить данные и отобразить их в более дружественном формате для третьих лиц, и мне никогда не удавалось найти особенно хорошееспособ сделать это.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Использование Стрелка :

>>> 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, как во втором примере.Лично я считаю, что первая форма выглядит чище.

0 голосов
/ 20 сентября 2018

Использование %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
0 голосов
/ 20 сентября 2018

Решение без использования стрелки.

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
0 голосов
/ 20 сентября 2018

Использование 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 () создает временную метку с 01.01.1970 UTC.Таким образом, вы можете затем использовать эту информацию для сложения / вычитания часов в зависимости от часового пояса.

Например, Мельбурн / Сидней (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, которые помогут отформатировать ваш ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...