【问题标题】:Convert "PST" to "US/Pacific" for use with Pytz将“PST”转换为“US/Pacific”以用于 Pytz
【发布时间】:2022-01-24 11:41:19
【问题描述】:

我正在尝试创建 HTTP 端点:

  1. 向用户返回在请求者所在时区的给定月份创建的帖子。
  2. 另一个获得 几个月 可能的帖子*。

示例

(1) 在请求者所在时区的月份获取帖子

(2) 获得帖子的可能月份

例如,如果用户在Sept-November 中发帖,但在December 中没有发帖,那么Jan 以后不会返回December。 但它采用"PST" 格式的时区,因为它执行SQL 查询

问题

不幸的是pytz,我用来获取月份所有帖子的库,只接受"US/Pacific"格式的时区

问题

  1. "US/Pacific" 的格式或字符串表示形式是什么?
  2. 如何在 Python 中将字符串格式 "PST""UCT""CST" 转换为各自的格式,如 "US/Pacific" 等?
  3. 这种格式的名称是什么,例如"US/Pacific"
  4. 是否有一种将"PST" 映射到"US/Pacific" 的字典?

【问题讨论】:

  • 您能否提供来自 API 的此类时间戳的数据样本?
  • 别忘了夏令时......
  • 另外,您面临的问题可能与夏令时转换有关。 PST 是启用夏令时的太平洋时间的简称,而美国/太平洋不限于 ST,并且会在需要时考虑 ST(至少在 python 中)。
  • @jlandercy 当然。类似于month=1year=2021time_zone='PST'
  • @jlandercy 不知道这一点。太好了。

标签: python timezone converters pytz


【解决方案1】:

时区术语

如何定义、表示或引用时区?一些术语:

  • UTC time offset(例如“UTC-08:00”)
  • 与 ISO 8601 日期/时间格式相关:time zone designator(例如“Z”或“-08”)
  • 时区:规范的名称
  • 时区:缩写

(规范)名称

拼写出的时区名称或(tz 名称)如“US/Pacific”或“Europe/Paris”也称为时区的规范名称。它们用作IANA time zone database 中的键。在RFC 6557 中,它们被称为“时区名称”。 Wikipedia 声称他们:

主要的首选区域名称。

另见:

缩写

像“UTC”、“PST”这样的字母字符串是abbreviations of time zone

时区转换

通常时区之间的转换是通过修改在ISO 8601, time zone designators 中表示的UTC 偏移量 来完成的,例如“-0800”(PST),即从“+0000 减去 8 小时” " (UTC)。

另见:

使用pytz 时区进行转换

要将给定的日期时间从 UTC 转换为目标时区(例如“美国/太平洋”),请在源日期时间实例上使用 astimezone(tz)

import datetime
from pytz import timezone, utc

utc_time = datetime.datetime.utcnow()

pst_tz = timezone('US/Pacific')
pst_time = utc_time.replace(tzinfo=utc).astimezone(pst_tz)

注意:

  • 时区 tz 是使用 pytz 的 tzinfo API 构建的,例如timezone('PST8PDT') 用于 PST 或 timezone('US/Central') 用于 CST
  • .replace() 是可选的,它将给定日期时间的时区重置为默认 UTC。

令人惊讶的是:pytz.all_timezones 中找不到“PST”缩写。最相似的是(在 REPL 中评估):

>>> import pytz
>>> pytz.timezone('PST8PDT')
<DstTzInfo 'PST8PDT' PST-1 day, 16:00:00 STD>
>>> pytz.timezone('US/Pacific')
<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>
>>> pytz.timezone('US/Central')
<DstTzInfo 'US/Central' LMT-1 day, 18:09:00 STD>

另见:

使用 zoneinfo 进行转换(自 3.9 起)

MrFuppes answer调整为“如何在python中使用带有日期时间对象的时区?”:

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

utc_time = datetime(2012,11,10,9,0,0, tzinfo=timezone.utc)

cst_tz = ZoneInfo("US/Central")
cst_time = utc_time.astimezone(cst_tz)

# safely use `replace` to get the same wall time in a different tz:
pst_time = cst_time.replace(tzinfo=ZoneInfo("US/Pacific"))

print(utc_time.isoformat())
print(cst_time.isoformat())
print(pst_time.isoformat())

(以上代码未经测试!)

另见:

【讨论】:

  • timezone('PST')pytz.exceptions.UnknownTimeZoneError: 'PST'
  • @user8714896 谢谢,没有测试,预计会出现通用缩写。 ?️ 现在它已经过测试 + 修复 ... 并扩展了 terminology 和新的 3.9 模块 zoneinfo
  • 我可能不够明确,我的意思更像是字符串“PST”到“US/Pacific”,不一定是时区子类
  • 像“PST”这样的缩写 tz 名称的问题在于,其中至少有一些是模棱两可的(例如,搜索“BST”;-)) - 这就是为什么它们不被库支持的原因,例如皮茨。消除这种歧义的常用方法是定义映射字典;例如将“PST”映射到“America/Los_Angeles”。例如,dateutils parser 可以使用这样的映射。
【解决方案2】:
import pytz
from datetime import datetime  # timezone

print('The supported tz:', pytz.all_timezones, '\n')
    
# Show date-time for different timezone/country
# current date and time of NY
datetime_NY = datetime.now(pytz.timezone('America/New_York'))
print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))
# NY: 07/28/2021, 05:49:41

# Timezone Conversion
# Any timezone to UTC
NY_to_utc = datetime_NY.astimezone(pytz.utc)
print("NY_to_utc: ", NY_to_utc.strftime("%m/%d/%Y, %H:%M:%S"))
# NY_to_utc:  07/28/2021, 09:49:41

Naive and Aware datetime时区处理参考这篇文章

  1. 显示不同时区/国家/地区的日期时间
  2. 时区转换
  3. 时区不感知/天真到时区感知
  4. 替换问题

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多