【问题标题】:Why is PST (America/Los_Angeles) time conversion to UTC, 1 hour behind?为什么 PST (America/Los_Angeles) 时间转换为 UTC,落后 1 小时?
【发布时间】:2021-02-04 18:54:36
【问题描述】:

我的传感器数据的时间戳已知为 PST(太平洋标准时间)。假设时间戳是:2020-10-21 10:00:00。我想将该时间戳转换为 UTC。 UTC 到 PST 的转换是 UTC-8。因此,UTC 中的 预期 时间戳提前 8 小时:2020-10-21 18:00:00

我尝试进行转换:

>>> import pytz
>>> from datetime import datetime
>>> ts = datetime(2020,10,21,10,0,0)
>>> ts_local = pytz.timezone('America/Los_Angeles').localize(ts, is_dst=False)
>>> ts_local.strftime('%Y-%m-%d %H:%M:%S %Z%z')
'2020-10-21 10:00:00 PDT-0700'
>>> ts_local.astimezone(pytz.utc).strftime('%Y-%m-%d %H:%M:%S %Z%z')
'2020-10-21 17:00:00 UTC+0000'

但是您可以看到转化比预期的晚了 1 小时。这似乎是有道理的,因为ts_local 似乎在PDT 中。但是,因为我设置了is_dst=False,所以我希望ts_local 位于PST 中。

  • 我已经尝试过 is_dst=Trueis_dst=None(尽管这些标志值没有意义,因为时间戳是标准时间)但生成的 ts_local 仍然是 PDT
  • 我在 Python 3.7.4 和 Python 2.7.17 中尝试过这种转换,得到了相同的结果。
  • 我也尝试过使用'US/Pacific' pytz 时区进行这种转换,但同样的问题。

我已经阅读了其他一些关于如何进行转换的 SO 答案,我所做的就是建议的内容。

【问题讨论】:

  • ts_local 不在 PST;它在 PDT 中。 is_dst 被忽略。

标签: python datetime pytz


【解决方案1】:

根据问题中给出的信息,对我来说,设置 时区(有 DST 更改!)是错误的方法,如果您只是在 x 小时内与 UTC 有一个固定的偏移量你的数据。这假设您的传感器的时钟没有将 DST 更改编码到其内存中。

因此,我的建议是使用固定偏移量 tzinfo:

from datetime import datetime, timedelta, timezone

dt = datetime.fromisoformat("2020-10-21 10:00:00")

# we know dt is UTC-8, so you can set the fixed offset:
dt_tzset = dt.replace(tzinfo=timezone(timedelta(hours=-8)))

# now you can convert to UTC easily:
dt_utc = dt_tzset.astimezone(timezone.utc)
print(dt_utc)
# 2020-10-21 18:00:00+00:00

【讨论】:

  • 这也许可以实现设置 UTC-8 固定偏移量的目标,但重要的是要指出这与该日期的太平洋时间完全相关和给定的时间。地球上唯一固定为 UTC-8 的陆地时区是Pacific/Pitcairn(皮特凯恩群岛,截至 2020 年 1 月,总人口 43 人)。
  • @MattJohnsonPint:首先,这确实完成了将固定偏移量转换为UTC的任务,其次我故意没有使用时区或太平洋时间这两个词。根据我对此类传感器数据的经验,这就是我的方法,仅此而已。
  • 这是有道理的。时间戳在 PST 中很方便,它不考虑夏令时偏移,所以我只需要在我的 PST 时间戳上添加 8 小时即可获得 UTC 时间戳。全年都是如此。另一方面,如果我的传感器的时间戳在 PDT 中,则无需执行任何操作,因为 2020-10-21 17:00:00 UTC2020-10-21 10:00:00 PDT 的正确 UTC 时间戳。到 2020 年 11 月 1 日,夏令时结束时,2020-11-03 10:00:00 PDT 将有一个 UTC-8 偏移量:2020-11-03 18:00:00 UTC
  • 潜在问题似乎是将时区信息与datetime 对象关联(通过调用pytz.timezone('America/Los_Angeles').localize(ts, is_dst=False))隐式创建了一个PDT(太平洋夏令时)日期时间。这不合适,因为我的时间戳在 PST 中。所以一个公平的后续问题是“如何创建 PST 时间戳”?
  • @MinhTran:好的,那么你最好使用固定偏移量:)
【解决方案2】:

来自the pytz docs

对于大多数时间戳,is_dst 参数被忽略。它仅在 DST 过渡模糊期使用以解决这种模糊性。

America/Los_Angeles 中的2020-10-21 18:00:00 没有歧义。毫无疑问是 UTC-7 (PDT)。

America/Los_Angeles 中不明确的时间戳的一个示例是 2020-11-01 01:00:00,因为由于 DST 回退转换,其中有两个。第一个是 01:00 PDT,第二个是 01:00 PST。

【讨论】:

猜你喜欢
  • 2019-09-01
  • 2021-09-05
  • 2016-01-13
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2021-05-28
  • 2021-05-24
相关资源
最近更新 更多