Python:从时间戳中添加或删除时区小时数并获取实际时间
Python: Add or remove timezone hours from a timestamp and get actual time
在Python中,我需要将给定字符串时间戳的实际时间转换为不带时区信息的不同时区。我正在使用 pytz 来执行此操作。但我得到的只是给定的 DateTime 附加了时区信息。
基准日期时间:2020-05-29 19:00:00(没有时区信息的字符串日期时间)
要求:当这个时间转换为(US Zipcode 90071)-0700时区时,
它应该 return “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')
但是这个 returns 2020-05-29 19:00:00.000000-0700。我需要检索一个 DateTime object/string,该时区显示的实际时间没有附加到 DateTime 末尾的时区块。
您的原始日期和时间似乎是 UTC。因此,为了 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)
假设你的 "Base datetime" 指的是 UTC,你必须先添加一个 tzinfo=UTC
before 你转换到另一个时区。此外,避免覆盖 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 是一个例外)。
旁注:如果您的 "Base datetime" 指的是 当地时间 (操作系统),您可以通过
获取该时区
import time
import dateutil
localtzname = time.tzname[time.daylight]
tz = dateutil.tz.gettz(localtzname)
在Python中,我需要将给定字符串时间戳的实际时间转换为不带时区信息的不同时区。我正在使用 pytz 来执行此操作。但我得到的只是给定的 DateTime 附加了时区信息。
基准日期时间:2020-05-29 19:00:00(没有时区信息的字符串日期时间)
要求:当这个时间转换为(US Zipcode 90071)-0700时区时, 它应该 return “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')
但是这个 returns 2020-05-29 19:00:00.000000-0700。我需要检索一个 DateTime object/string,该时区显示的实际时间没有附加到 DateTime 末尾的时区块。
您的原始日期和时间似乎是 UTC。因此,为了 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)
假设你的 "Base datetime" 指的是 UTC,你必须先添加一个 tzinfo=UTC
before 你转换到另一个时区。此外,避免覆盖 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 是一个例外)。
旁注:如果您的 "Base datetime" 指的是 当地时间 (操作系统),您可以通过
获取该时区import time
import dateutil
localtzname = time.tzname[time.daylight]
tz = dateutil.tz.gettz(localtzname)