【问题标题】:Changing timezone to datetime object without using pytz在不使用 pytz 的情况下将时区更改为 datetime 对象
【发布时间】:2022-01-24 08:07:48
【问题描述】:

我在尝试更改没有 pytz 模块的日期时间对象的时区时遇到了一些问题。所以基本上我不需要使用pytz就需要这段代码:

def change_timezone(date: str, tz: str):
    tz = pytz.timezone(tz)
    date = datetime.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ")
    return date = date.replace(tzinfo=pytz.utc).astimezone(tz=tz)

我在不允许我使用外部 Python 模块的外部平台上运行此脚本,这就是我不能使用 pytz 的原因。

此函数的输入是一个包含 UTC 时区日期的字符串(例如:date = "2021-11-30T23:00:00Z")和另一个指定日期应转换到的时区的字符串(例如:tz = "Europe/Madrid")。

不使用 pytz 有什么办法吗?

谢谢!

更新

使用 zoneinfo 模块时:

from zoneinfo import ZoneInfo
SPAIN = ZoneInfo("America/Los_Angeles")

我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\zoneinfo\_common.py", line 12, in load_tzdata     
    return importlib.resources.open_binary(package_name, resource_name)
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\importlib\resources.py", line 88, in open_binary  
    package = _get_package(package)
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\importlib\resources.py", line 49, in _get_package 
    module = _resolve(package)
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\importlib\resources.py", line 40, in _resolve     
    return import_module(name)
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tzdata'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\sydea\Desktop\Cargadores solares\Proyecto\OCPP-1.6J-CS-I\pruebas.py", line 8, in <module>
    SPAIN = ZoneInfo("America/Los_Angeles")
  File "C:\Users\sydea\AppData\Local\Programs\Python\Python39-32\lib\zoneinfo\_common.py", line 24, in load_tzdata
    raise ZoneInfoNotFoundError(f"No time zone found with key {key}")
zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key America/Los_Angeles'

更新 我不知道这是否有帮助,但运行此代码:

import sysconfig
print(sysconfig.get_config_var("TZPATH"))

显示这条路径:

/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo

【问题讨论】:

  • 您可以在该主机上使用的 Python 版本是什么? 3.9+ 有一个内置的zoneinfo 模块。
  • a way to parse ISO8601 with Z 表示 UTC 以了解日期时间,a way to convert 使用 zoneinfo(基本上只需使用 astimezone,因为你已经拥有它了)。
  • 另外,“外部”究竟是什么意思?您通常可以在 .py 文件中包含整个 pytz 文件夹,您不需要像 pip 这样的工具来“安装”它。只要你能上传 .py 文件,你可以添加任何你想要的模块,很少有例外。
  • 你好@deceze,我使用的是python 3.9.5。当使用这样的 zoneinfo 模块时: from zoneinfo import ZoneInfo SPAIN = ZoneInfo("Europe/Madrid") 我收到以下错误:ibb.co/wNx0WbY。我无法上传任何文件,我只有一个可用于 python 脚本的编辑器,没有别的。
  • Sooo……你在那个奇怪的编辑器上做什么? ??? docs.python.org/3/library/…

标签: python datetime timezone utc pytz


【解决方案1】:

使用 dateutil 中的 tz:

  from dateutil import tz
  import datetime

  start_date = datetime.datetime.strptime(str_datetime, "%Y-%m-%dT%H:%M:%SZ")
  from_zone = tz.gettz('UTC')
  to_zone = tz.gettz('Europe/Madrid')

  start_date = start_date.replace(tzinfo = from_zone)

  local = start_date.astimezone(to_zone)

【讨论】:

  • 顺便说一句。而不是在解析指令中使用文字Z,而是使用%z 直接获取UTC 感知日期时间(然后不需要replace
  • @MrFuppes 很好的建议!谢谢!!
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2013-03-02
  • 2018-07-24
  • 2013-08-30
  • 1970-01-01
  • 2019-06-23
  • 2023-03-17
相关资源
最近更新 更多