динамически конвертировать метку времени в наивную дату и время - PullRequest
0 голосов
/ 04 сентября 2018

Является ли это допустимым решением для динамического преобразования строкового времени в наивный объект datetime? Под динамикой я подразумеваю, где бы ни находился сервер, на котором выполняется этот код, я всегда получаю наивный объект datetime. Я боюсь что-то упустить здесь

from time import timezone as diff_to_utc
from datetime import datetime, timedelta


time_str = "2018-09-15T15:30:00"  # here for example CEST
time_dt_utc = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S") + \
              timedelta(seconds=diff_to_utc)
time_dt_utc
>> datetime.datetime(2018, 9, 15, 14, 30)

Обновление, чтобы уточнить мой вопрос

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

1 Ответ

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

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

Давайте начнем с этой заметки:

Для указанных выше констант часового пояса ([...] timezone [...]) значение определяется правилами часового пояса, действующими во время загрузки модуля или при последнем вызове tzset(), и может быть неверно для времен в прошлом. Рекомендуется использовать tm_gmtoff и tm_zone результаты из localtime() для получения информации о часовом поясе.

Итак, начнем с замены from time import timezone as diff_to_utc на это:

import time

local_offset = time.localtime().tm_gmtoff

Затем вы просто анализируете вашу строку для наивного объекта datetime:

from datetime import datetime

time_str = '2018-09-15T15:30:00'
naive = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S')
# datetime.datetime(2018, 9, 15, 15, 30)

Затем отметьте эту временную метку, добавив к ней информацию о часовом поясе, которую вы определили (любым способом):

from datetime import timezone, timedelta

aware = naive.astimezone(timezone(timedelta(seconds=local_offset)))
# datetime.datetime(2018, 9, 15, 15, 30, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

Затем, если необходимо, преобразовать его в UTC:

utc = aware.astimezone(timezone.utc)
# datetime.datetime(2018, 9, 15, 13, 30, tzinfo=datetime.timezone.utc)

А если вам как-то это нужно, сделайте его снова наивным:

naive_utc = utc.replace(tzinfo=None)
# datetime.datetime(2018, 9, 15, 13, 30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...