You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫获取HLTV赛事时间与浏览器显示不一致的时区适配问题

解决HLTV爬虫时间与浏览器显示差1小时的问题

这个问题的核心是时区转换差异:浏览器会自动将HLTV服务器返回的原始时间转换为你的本地时区(GMT+3,伊斯坦布尔),而你的爬虫直接拿到的是HLTV服务器的本地时间(欧洲中部时间CET/CEST,夏令时为UTC+2,非夏令时为UTC+1),所以才会出现1小时的差值。

下面给你两种可靠的解决方案,优先推荐第一种(用Unix时间戳),因为它完全避免时区歧义:

方案1:提取页面中的Unix时间戳(最准确)

HLTV的赛事元素里自带data-unix属性,存储的是UTC时间戳(秒级),我们可以直接拿这个时间戳转换为你的本地时区:

import datetime
import requests
from bs4 import BeautifulSoup

# 请求HLTV赛事页面
url = "https://www.hltv.org/matches"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 遍历所有赛事卡片
match_cards = soup.find_all("div", class_="match")
for card in match_cards:
    # 获取Unix时间戳
    unix_ts = int(card.get("data-unix"))
    # 转换为UTC时间对象
    utc_time = datetime.datetime.fromtimestamp(unix_ts, datetime.timezone.utc)
    # 转换为伊斯坦布尔时区(GMT+3,土耳其全年固定时区,无夏令时)
    istanbul_tz = datetime.timezone(datetime.timedelta(hours=3), name="GMT+3")
    local_match_time = utc_time.astimezone(istanbul_tz)
    # 格式化输出,和浏览器显示一致
    print(f"赛事时间(浏览器显示):{local_match_time.strftime('%Y-%m-%d %H:%M')}")

方案2:解析文本时间并转换时区

如果你只能从页面文本中提取时间字符串(比如"13:00"),需要先将其关联到HLTV的服务器时区,再转换为你的本地时区:

import datetime

# 假设你从页面提取到的时间(HLTV服务器时间,夏令时为UTC+2)
hltv_time_str = "2024-05-20 13:00"
# 定义HLTV的时区(夏令时用UTC+2,非夏令时切换为UTC+1)
hltv_tz = datetime.timezone(datetime.timedelta(hours=2), name="CEST")
# 解析为带时区的时间对象
hltv_time = datetime.datetime.strptime(hltv_time_str, "%Y-%m-%d %H:%M").replace(tzinfo=hltv_tz)
# 转换为伊斯坦布尔时区
istanbul_tz = datetime.timezone(datetime.timedelta(hours=3), name="GMT+3")
local_time = hltv_time.astimezone(istanbul_tz)
print(f"浏览器显示时间:{local_time.strftime('%Y-%m-%d %H:%M')}")

关键注意点

  • 土耳其自2016年起取消了夏令时,全年固定使用GMT+3,所以不用处理夏令时切换的问题。
  • 不要直接给爬虫拿到的时间硬加1小时——这种做法在HLTV切换夏令时(比如每年3月/10月)时会出错,必须用标准的时区转换方法。
  • 优先使用data-unix的时间戳,因为它是UTC标准时间,完全没有时区解析错误的风险。

内容的提问来源于stack exchange,提问作者user5743273

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:24