Python: Добавить или удалить часы часового пояса из метки времени и получить фактическое время. - PullRequest
1 голос
/ 29 мая 2020

В Python мне нужно получить фактическое время данной строковой метки времени, преобразованное в другой часовой пояс без информации о часовом поясе. Для этого я использую pytz. Но все, что я получаю, это заданный DateTime с добавленной к нему информацией о часовом поясе.

Базовое datetime: 2020-05-29 19:00: 00 (строка datetime без информации о часовом поясе)

Требование: если это время преобразовано в (почтовый индекс США 90071) -0700 часовой пояс, он должен вернуть « 2020-05-29 12: 00: 00 », не " 2020-05-29 19: 00: 00-0700 "

Код:

import pytz
from datetime import datetime
from uszipcode import SearchEngine
from timezonefinder import TimezoneFinder

date_time_obj = datetime.strptime("2020-05-29 19:00:00", '%Y-%m-%d %H:%M:%S')
zip = "90071"

search = SearchEngine(simple_zipcode=True)
zipcode = search.by_zipcode(zip)
zipcode = zipcode.to_dict()
tf = TimezoneFinder(in_memory=True)
timezone = tf.timezone_at(lng=zipcode['lng'], lat=zipcode['lat'])
tz = pytz.timezone(timezone)
new_timestamp = tz.localize(date_time_obj)

new_timestamp_str = datetime.strftime(new_timestamp, '%m/%d/%Y %H:%M:%S')

Но это возвращает 2020-05-29 19 : 00: 00.000000-0700 . Мне нужно получить объект / строку DateTime с фактическим временем, показанным в этом часовом поясе, без фрагмента часового пояса, прикрепленного к концу DateTime.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Похоже, что ваша исходная дата и время указаны в UT C. Итак, чтобы localize работал правильно, вы должны начать с привязанного часового пояса.

date_time_obj = datetime.strptime("2020-05-29 19:00:00", '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.utc)

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

return date_time_obj.astimezone(tz).replace(tzinfo=None)
1 голос
/ 29 мая 2020

Предполагая, что ваша «Базовая дата и время» относится к UT C, вам нужно добавить tzinfo=UTC first перед , которое вы конвертируете в другой часовой пояс. Также избегайте перезаписи встроенных модулей, например zip. Пример использования dateutil:

from datetime import datetime
import dateutil
from uszipcode import SearchEngine
from timezonefinder import TimezoneFinder

date_time_obj = datetime.strptime("2020-05-29 19:00:00", '%Y-%m-%d %H:%M:%S')
zipcode = "90071"

search = SearchEngine(simple_zipcode=True)
zipcode = search.by_zipcode(zipcode)
zipcode = zipcode.to_dict()
tf = TimezoneFinder(in_memory=True)
timezone = tf.timezone_at(lng=zipcode['lng'], lat=zipcode['lat'])

# localize to UTC first
date_time_obj = date_time_obj.replace(tzinfo=dateutil.tz.UTC)

# now localize to timezone of the zipcode:
new_timestamp = date_time_obj.astimezone(dateutil.tz.gettz(timezone))

new_timestamp_str = datetime.strftime(new_timestamp, '%m/%d/%Y %H:%M:%S')
# '05/29/2020 12:00:00'

Если вам нужно использовать pytz, убедитесь, что вы используете localize вместо replace (хотя UT C является исключением).

Примечание: если ваша «Базовая дата и время» относится к местному времени (операционная система), вы можете получить этот часовой пояс с помощью

import time
import dateutil
localtzname = time.tzname[time.daylight]
tz = dateutil.tz.gettz(localtzname)
...