Конвертировать наивное время с известным местоположением в дату и время UTC - PullRequest
0 голосов
/ 06 января 2019

Пользователи моего приложения вводят запланированные события, предоставляя

  • дата
  • время начала
  • время окончания
  • географическое положение (на карте)

Я бы хотел перевести даты и время в UTC. Мое приложение работает на GAE (Python), поэтому такие инструменты, как timezonefinder или pytzwhere, не работают (модули имеют зависимости, которые не поддерживаются во время выполнения GAE).

Использование онлайн API было бы решением. Пока что я проверил API часового пояса Google. Вы указываете географическое местоположение, и он будет возвращать информацию о часовом поясе. Однако, чтобы справиться с DST, вы также должны предоставить ему временную метку. Как ни странно, вы должны предоставить метку времени UTC в качестве ввода, и это именно то, что я хочу в качестве вывода!

Я могу дать ему временную метку на основе моей локальной информации о дате и времени (то есть без коррекции часового пояса), и она вернет мне rawOffset и dstOffset, которые мне нужны для преобразования моего локального времени и даты в UTC, но это может быть неверно для дат и времени в течение некоторых период вокруг перехода DST ([-12h, +12 часов], я считаю, в зависимости от фактического смещения), потому что я не предоставил правильную метку времени UTC.

Существует ли очевидный (онлайновый) метод преобразования локальной даты-времени в дату-время UTC на основе географического местоположения?

Один из способов получить некоторую точность, о которой я подумал, - это применить rawOffset и dstOffset, которые я получаю от API, снова сгенерировать временную метку UTC и еще раз вызвать API с этой временной меткой. Период около транзита DST, где мои результаты могут быть неверными, теперь должен быть ограничен до +/- 1 час. Но это сверх моего впечатления, также учитывая квоту на API.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Чтобы преобразовать локальную информацию о времени и дате в UTC на основе географического местоположения, вы можете просто передать произвольную метку времени в API часовых поясов Google с основной целью получения timeZoneId для местоположения.

Пример запроса:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=0&key=YOUR_API_KEY

Пример ответа:

{
   "dstOffset" : 0,
   "rawOffset" : -28800,
   "status" : "OK",
   "timeZoneId" : "America/Los_Angeles",
   "timeZoneName" : "Pacific Standard Time"
}

Тогда вы могли бы использовать timeZoneId и введенную пользователем информацию о дате и времени вместе с pytz, чтобы создать объект даты и времени Python по местному времени, а также получить метку времени UTC, которую, я думаю, вы ищете. Этот подход будет обрабатывать переход на летнее время на основе введенной пользователем даты. Например:

from datetime import datetime
from pytz import timezone, utc

pacific = timezone('America/Los_Angeles')

pdt = pacific.localize(datetime(2018, 5, 1, 8, 0, 0))
pst = pacific.localize(datetime(2018, 12, 1, 8, 0, 0))
pdt_utc = pdt.astimezone(utc)
pst_utc = pst.astimezone(utc)

# Pacific Daylight Time
print(pdt)
# 2018-05-01 08:00:00-07:00

# Pacific Standard Time
print(pst)
# 2018-12-01 08:00:00-08:00

# UTC
print(pdt_utc)
# 2018-05-01 15:00:00+00:00
print(pst_utc)
# 2018-12-01 16:00:00+00:00

Важно: я не проверял это со всеми возможными возвращаемыми значениями из API для timeZoneId, чтобы гарантировать, что то, что возвращается из API, будет правильно интерпретировано pytz (это работает с примером часового пояса " America / Los_Angeles ", но вам нужно проверить, чтобы убедиться, что это надежное решение для географических регионов, с которыми вы работаете).

0 голосов
/ 06 января 2019

На своих веб-страницах вы можете использовать функцию JavaScript getTimezoneOffset для расчета разницы во времени между местным временем пользователя и временем UTC:

Метод getTimezoneOffset() возвращает разницу часовых поясов, в минут от текущей локали (настройки хост-системы) до UTC.

Затем вы можете добавить параметр ко всем URL-адресам, для которых требуется смещение часового пояса. Другое решение - поместить это в файл cookie.

Со стороны сервера вы можете получить смещение часового пояса для расчета даты / времени в формате UTC.

...