Преобразовать строку даты и времени UTC в местную дату и время - PullRequest
181 голосов
/ 22 января 2011

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

В двух словах, android app отправляет мне (appengine app) данные, и в этих данных есть временная метка.Чтобы сохранить эту временную метку в UTC время, я использую:

datetime.utcfromtimestamp(timestamp)

Это, кажется, работает.Когда мое приложение хранит данные, они сохраняются на 5 часов вперед (я EST -5)

Данные хранятся в BigTable appengine, и при получении они выглядят как строка:

"2011-01-21 02:37:21"

Как преобразовать эту строку в DateTime в часовом поясе пользователя?

Кроме того, каково рекомендуемое хранилище для информации о часовом поясе пользователя?(Как вы обычно храните информацию tz, например: «-5: 00» или «EST» и т. Д. И т. Д.?) Я уверен, что ответ на мой первый вопрос может содержать параметр, а ответы - второй.

Ответы [ 12 ]

0 голосов
/ 17 октября 2018
import datetime

def utc_str_to_local_str(utc_str: str, utc_format: str, local_format: str):
    """
    :param utc_str: UTC time string
    :param utc_format: format of UTC time string
    :param local_format: format of local time string
    :return: local time string
    """
    temp1 = datetime.datetime.strptime(utc_str, utc_format)
    temp2 = temp1.replace(tzinfo=datetime.timezone.utc)
    local_time = temp2.astimezone()
    return local_time.strftime(local_format)

utc = '2018-10-17T00:00:00.111Z'
utc_fmt = '%Y-%m-%dT%H:%M:%S.%fZ'
local_fmt = '%Y-%m-%dT%H:%M:%S+08:00'
local_string = utc_str_to_local_str(utc, utc_fmt, local_fmt)
print(local_string)   # 2018-10-17T08:00:00+08:00

например, мой часовой пояс ' + 08: 00 '. введите utc = 2018-10-17T00: 00: 00.111Z , тогда я получу вывод = 2018-10-17T08: 00: 00 + 08: 00

0 голосов
/ 04 апреля 2018

Вы можете использовать стрелка

from datetime import datetime
import arrow

now = datetime.utcnow()

print(arrow.get(now).to('local').format())
# '2018-04-04 15:59:24+02:00'

Вы можете кормить arrow.get() чем угодно.отметка времени, строка iso и т. д.

...