返回

Windows 中 Python `strftime()` 获取正确 UTC 时差的终极指南

windows

在 Windows 中使用 Python strftime() 获取正确的 UTC 时差

问题

在 Windows 系统中使用 time.strftime("%z") 获取 UTC 时差时,常常会遇到无法获取正确时差的问题,反而得到了时区名称(例如,“Eastern Daylight Time”)。

解决方案

要解决此问题,需要执行以下步骤:

1. 设置 TZ 环境变量

打开控制面板,依次转到“系统和安全”->“系统”->“高级系统设置”,点击“环境变量”按钮。在“系统变量”下,找到名为“TZ”的变量,并将其值设置为相应的时区字符串。例如,对于美国东部时区,可以将其值设置为“America/New_York”。

2. 使用 "%Z" 格式说明符

在 Python 代码中,使用 time.strftime("%Z") 获取 UTC 时差。此格式说明符将返回时区名称,类似于使用 %z

3. 解析时区名称

使用 dateutil.tz 库解析时区名称并提取 UTC 时差。安装 dateutil 库:pip install python-dateutil。在 Python 代码中,使用以下代码解析时区名称:

import dateutil.tz
from datetime import datetime

# 获取当前时间并解析时区名称
tz = dateutil.tz.gettz('America/New_York')
now = datetime.now(tz)
utc_offset = now.utcoffset()

# 将 UTC 时差转换为 +HHMM 或 -HHMM 格式
offset_str = "+" if utc_offset.days >= 0 else "-"
offset_str += f"{utc_offset.days * 24 + utc_offset.seconds // 3600:02d}"

示例代码

import dateutil.tz
from datetime import datetime

# 获取当前时间并解析时区名称
tz = dateutil.tz.gettz('America/New_York')
now = datetime.now(tz)
utc_offset = now.utcoffset()

# 将 UTC 时差转换为 +HHMM 或 -HHMM 格式
offset_str = "+" if utc_offset.days >= 0 else "-"
offset_str += f"{utc_offset.days * 24 + utc_offset.seconds // 3600:02d}"

# 打印 UTC 时差
print(f"UTC 时差:{offset_str}")

注意

确保已正确设置 TZ 环境变量,并且使用的时区字符串与 Windows 系统时区设置相匹配。否则,解析可能会失败。

常见问题解答

1. 为什么在 Windows 中使用 time.strftime("%z") 会返回时区名称而不是 UTC 时差?

这是因为 Windows 默认不提供 UTC 时差信息。

2. 如何在不使用 dateutil.tz 库的情况下解析时区名称?

可以使用以下代码手动解析时区名称:

import re

def parse_timezone_name(tz_name):
  """解析时区名称并提取 UTC 时差。

  Args:
    tz_name: 时区名称。

  Returns:
    UTC 时差,格式为 +HHMM 或 -HHMM。
  """

  match = re.match(r"^(?P<sign>[+-])(?P<hours>\d{2}):(?P<minutes>\d{2})
import re

def parse_timezone_name(tz_name):
  """解析时区名称并提取 UTC 时差。

  Args:
    tz_name: 时区名称。

  Returns:
    UTC 时差,格式为 +HHMM 或 -HHMM。
  """

  match = re.match(r"^(?P<sign>[+-])(?P<hours>\d{2}):(?P<minutes>\d{2})$", tz_name)
  if match:
    return f"{match.group('sign')}{match.group('hours')}{match.group('minutes')}"
  else:
    raise ValueError("无效的时区名称")
quot;
, tz_name) if match: return f"{match.group('sign')}{match.group('hours')}{match.group('minutes')}" else: raise ValueError("无效的时区名称")

3. 如何使用 strftime() 格式化其他时间信息?

strftime() 还可用于格式化其他时间信息,例如年份、月份和日期。有关格式说明符的完整列表,请参阅 Python 文档。

4. 如何在 Linux 或 macOS 系统中获取 UTC 时差?

在 Linux 或 macOS 系统中,可以使用 date -u 命令获取 UTC 时差,格式为 ±HHMM

5. 如何使用 time.strftime() 获取其他时区的时间?

可以使用 time.tzset() 设置其他时区,然后使用 time.strftime() 获取该时区的时间。