【问题标题】:Python: Add or remove timezone hours from a timestamp and get actual timePython:从时间戳中添加或删除时区小时并获取实际时间
【发布时间】:2020-05-29 13:59:31
【问题描述】:

在 Python 中,我需要在没有时区信息的情况下将给定字符串时间戳的实际时间转换为不同的时区。我正在使用 pytz 来执行此操作。但我得到的只是给定的 DateTime,并附加了时区信息。

基准日期时间:2020-05-29 19:00:00(没有时区信息的字符串日期时间)

要求:当这个时间转换为(US Zipcode 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 末尾的时区块。

【问题讨论】:

  • 等等,你如何将datetime 转换为字符串?您发布的代码中缺少该部分。
  • @MarkRansom 用那部分更新了问题,
  • 我不明白,如果格式没有指定,我不希望strftime 包含时区。
  • @MarkRansom 我只需要从 2020-05-29 19:00:00 减去 0700 并得到 2020-05-29 12:00:00。作为 DateTime 对象或字符串。

标签: python python-3.x python-2.7 datetime python-datetime


【解决方案1】:

假设您的“基准日期时间”是指 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 是一个例外)。

旁注:如果您的“基准日期时间”是指本地时间(操作系统),您可以通过

获取该时区
import time
import dateutil
localtzname = time.tzname[time.daylight]
tz = dateutil.tz.gettz(localtzname)

【讨论】:

  • 谢谢。这行得通。它使用的是服务器时间而不是 PC 时间。
  • @TechyTee:好的,那应该是 UTC :)
【解决方案2】:

您的原始日期和时间似乎是 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)

【讨论】:

  • 不,这不起作用。它仍然给出“2020-05-29 19:00:00”
  • @TechyTee 抱歉,这是一台尚未安装 pytz 的新 PC,所以我无法尝试。但它应该有效!
  • @TechyTee 我安装了 pytz 并尝试了我原来的答案,它根本不起作用 - 产生了错误!我已经更新了,看看现在能不能用。
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2021-12-03
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多