【问题标题】:How do you convert local time (PDT) to PST using python如何使用 python 将本地时间 (PDT) 转换为 PST
【发布时间】:2015-09-08 09:32:54
【问题描述】:

如果我想转换时区,通常我会这样做

# local interpreted as pst to utc

utc = pytz.utc
pst = pytz.timezone('America/Los_Angeles')


start_time_str = time.strftime('%Y-%m-%d %H:%M:%S', \
  time.localtime(start_time))
start_time_datetime = \
  datetime.datetime.strptime(start_time_str, "%Y-%m-%d %H:%M:%S")

start_time_datetime = \
  start_time_datetime.replace(tzinfo=pst).astimezone(utc)

现在我想做类似的事情,比如我想将本地时间转换为 pst

localtime = datetime.datetime.fromtimestamp(time.mktime(
            time.localtime()))

我不确定您将如何实现这一目标

任何帮助将不胜感激

【问题讨论】:

  • 您的意见是什么?是 Unix 时间start_time(一个数字)吗?为什么你打电话给strftime()只是为了马上打电话给strptime()(相反的转换)? localtime计算的目的是什么(你知道datetime.now())吗?

标签: python datetime time timezone


【解决方案1】:

首先,请注意,当地时间是标准时间或夏令时 - 不能同时是两者。我相信你真正得到的是询问是否有办法判断时间是否是夏令时。换句话说,给定特定的一天,是否是夏令时中的特定时间?另一个常见用例是将在特定时间偏移处挂钩的表格数据转换为当前正确时间。

好的,我可以想到三种方法来做到这一点。

(1) 您可以将datetime 转换为time 对象并查看.tm_isdst 属性similar to this answer。您可以对其进行测试以查看该属性是否等于 1,然后减去一小时的 timedelta

>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=12, 
tm_min=36, tm_sec=32, tm_wday=5, tm_yday=320, tm_isdst=0)
>>> time.localtime().tm_isdst
0

(2)第二种方式是每月十五号中午以上逐月爬取,查看偏移量是否变化。 (请注意,某些地区不实施 DST。)较大的值表示夏令时向前跳过。 (例如,PDT 是 UTC -7 而 PST 是 UTC -8。)根据这些值,您可以计算时差。然后您可以通过检查偏移量来测试您的时间,看看它是在标准时间还是夏令时。 Offest 是这样检查的:

>>> my_special_pdt_datetime.strftime('%z') 
'-0700'

(3) 而且,也许最简单的方法是通过获取 offset = datetime.datetime.utcnow() - datetime.datetime.now() 来计算现有偏移量,然后将其与 pytz 的已知偏移量进行比较:

>>> pytz.timezone('US/Pacific').localize(datetime.datetime(2019,1,1)).strftime('%z')
'-0800'

【讨论】:

  • 您是说要求将 PDT 转换为 PST(反之亦然)是不是有效?就我而言,我知道时间戳8/28/20 5:34:00 位于太平洋标准时间,时区为 America/Los_Angeles。我正在尝试将其转换为 UTC 并期望 UTC 时间戳为8/28/20 13:34:00。但是pytz.localize()8/28/20 5:34:00 解释为PDT 并添加了错误的偏移量,给了我8/28/20 12:34:00
  • @MinhTran 标准时间和夏令时是相互排斥的,所以你要么在其中要么在另一个。 2020 年 8 月 28 日,我们在 PDT,因此 Python 将独家报告 PDT 值。因此,它在技术上是可行的,但不是明确合法的。如果您想在任何给定时间(但不是日期)从 PST 转换为 PDT,您只需添加一个小时。或者,您可以使用time.localtime().tm_isdst 参数检测您是否在 PDT 内,并根据该参数添加小时。
【解决方案2】:

您的代码包含不必要的(在strftime 之后调用strptime)或只是错误的(.replace())转换。

在给定“自纪元以来的秒数”start_timetime.time() 返回的值)的情况下创建可感知的日期时间对象:

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz

tz = pytz.timezone('America/Los_Angeles')
start_time_datetime = datetime.fromtimestamp(start_time, tz)

As @Matt Johnson mentions, 'America/Los_Angeles' 时区 id 根据日期生成带有 PST 或 PDT tzname 的时间。无需转换。

您问题中的最后一个代码示例都有不必要的转换,并且在某些情况下可能会失败。如果目的是将本地时区的当前时间作为可感知的日期时间对象,那么您可以使用tzlocal module:

#!/usr/bin/env python
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal

local_timezone = get_localzone() # pytz timezone corresponding to the  local time
current_localtime = datetime.now(local_timezone)

【讨论】:

    【解决方案3】:

    两件事:

    1. "America/Los_Angeles" 标识符代表整个太平洋时区,包括 PST 和 PDT。它将使用 -8 或 -7 作为时区偏移量,具体取决于使用它的具体日期和时间。

    2. 调用replace(tzinfo=...) 是一个错误。请改用localize。见the pytz documentation。这在引言和第一个示例中进行了讨论。

    【讨论】:

    • +1 用于提及localize,这非常重要。如果你使用replace,你会得到一些非常奇怪的错误,这与在datetime构造函数中指定时区对象是一样的。
    • 您可以拨打.replace(tzinfo=...),然后拨打.localize().astimezone()。事实上,如果NoneNone,您可能确实想替换datetime 对象,这样datetime 对象就不再天真了。不过,我不会将它用于任何事情,直到我在其上运行localize,一旦你定义了原始时区,这很容易。我认为这是一个幼稚的日期时间对象,其中可能会看到奇怪的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2019-10-21
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多