在Python中,我需要将给定字符串时间戳的实际时间转换为不带时区信息的不同时区。我正在使用 pytz 来做到这一点。但我得到的只是给定的 DateTime 以及附加的时区信息。
基准日期时间:2020-05-29 19:00:00(没有时区信息的字符串日期时间)
要求:当该时间转换为(美国邮政编码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 末尾的时区 block 。
最佳答案
假设您的“基准日期时间”指的是 UTC,您必须先添加 tzinfo=UTC
然后转换到另一个时区。另外,请避免覆盖 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
(即使UTC是一个异常(exception))。
旁注:如果您的“基准日期时间”指的是本地时间(操作系统),您可以通过以下方式获取该时区
import time
import dateutil
localtzname = time.tzname[time.daylight]
tz = dateutil.tz.gettz(localtzname)
关于Python:从时间戳中添加或删除时区小时并获取实际时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62087679/