首页 > 人工智能 > 人工智能 > 世界杯开幕了,手把手教你做个看球小工具

帮我查一下墨西哥队的小组赛,转成北京时间,再告诉我哪天能看。
6 月 18 日,换成北京时间后已经是
6 月 19 日。如果我们只按比赛当地日期查询,国内读者输入“6 月 19 日有什么比赛”时,反而可能查不到自己那天真正能看的比赛。用户输入球队或日期 ↓ 程序读取本地赛程数据 ↓ 程序筛选对应比赛 ↓ 程序完成时区换算 ↓ 输出当地时间、北京时间和美东时间
worldcup-helper。你可以在电脑上手动新建,也可以在终端执行:mkdir worldcup-helper
worldcup-helper 文件夹。worldcup-helper/ ├── matches.json └── worldcup_helper.py
matches.json:存放比赛数据worldcup_helper.py:读取数据、查询比赛、转换时区,并输出结果matches.json,把下面这份示例数据写进去:[
{
"id": "match_001",
"match_no": 1,
"date": "2026-06-11",
"time": "13:00",
"timezone": "America/Mexico_City",
"team_a": "Mexico",
"team_b": "South Africa",
"stage": "First Stage",
"group": "Group A",
"venue": "Mexico City Stadium",
"city": "Mexico City",
"source": "FIFA"
}
]
"date": "2026-06-11", "time": "13:00", "timezone": "America/Mexico_City"
date:当地日期time:当地开球时间timezone:比赛所在时区team_a /
team_b:对阵双方venue /
city:比赛地点worldcup_helper.py。matches.jsonworldcup_helper.py:from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
import json
BASE_DIR = Path(__file__).resolve().parent
MATCHES_FILE = BASE_DIR / "matches.json"
def load_matches(path=MATCHES_FILE):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def match_time(match):
source_tz = ZoneInfo(match["timezone"])
local_time = datetime.fromisoformat(
f'{match["date"]}T{match["time"]}'
)
return local_time.replace(tzinfo=source_tz)
def convert_time(match, target_timezone):
return match_time(match).astimezone(ZoneInfo(target_timezone))
def find_by_team(matches, team_name):
team_name = team_name.lower()
return [
match for match in matches
if team_name in match["team_a"].lower()
or team_name in match["team_b"].lower()
]
def format_match(match):
beijing_time = convert_time(match, "Asia/Shanghai")
eastern_time = convert_time(match, "America/New_York")
return f"""
比赛:{match["team_a"]} vs {match["team_b"]}
阶段:{match["stage"]} / {match["group"]}
地点:{match["venue"]}, {match["city"]}
当地时间:{match["date"]} {match["time"]} ({match["timezone"]})
北京时间:{beijing_time.strftime("%Y-%m-%d %H:%M")}
美东时间:{eastern_time.strftime("%Y-%m-%d %H:%M")}
""".strip()
if __name__ == "__main__":
matches = load_matches()
results = find_by_team(matches, "Mexico")
if not results:
print("没有找到相关比赛")
else:
print(format_match(results[0]))
match_time() 和
convert_time() 这两个函数。match_time()。JSON 里存的是拆开的
date、
time 和
timezone,程序需要先把它们组合成一个真正可计算的时间对象。这里的
datetime.fromisoformat() 会把
2026-06-11 和
13:00 拼成 Python 能识别的时间;后面的
replace(tzinfo=source_tz) 则是给这个时间补上时区信息。2026-06-11 13:00 这串时间本身是不完整的。只有配上
America/Mexico_City,程序才知道它指的是墨西哥城当地时间,而不是北京时间或美东时间。convert_time()。这里没有手动写“墨西哥时间 +14 小时 = 北京时间”,而是调用
astimezone(),把这个带时区的时间转换到目标时区。因为时区换算不只是简单加减几个小时,还可能涉及日期跨天、夏令时、不同城市的时区规则等问题。只要把源时区和目标时区写清楚,剩下的换算交给 Python 处理。BASE_DIR = Path(__file__).resolve().parent MATCHES_FILE = BASE_DIR / "matches.json"
matches.json。这样即使你不是在项目目录里运行脚本,也不容易因为路径问题找不到数据文件。matches.json 和
worldcup_helper.py 后,在终端里进入项目目录:cd worldcup-helper
python3 worldcup_helper.py
比赛:Mexico vs South Africa 阶段:First Stage / Group A 地点:Mexico City Stadium, Mexico City 当地时间:2026-06-11 13:00 (America/Mexico_City) 北京时间:2026-06-12 03:00 美东时间:2026-06-11 15:00

worldcup_helper.py 里写死了查询
Mexico,只执行
python3 worldcup_helper.py。即使我们在命令后面追加了球队参数,命令依旧会执行查询 Mexico。像是这样
python3 worldcup_helper.py --team Mexico
python3 worldcup_helper.py --date 2026-06-19
worldcup_helper.py 里的内容替换成下面这样:from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
import argparse
import json
BASE_DIR = Path(__file__).resolve().parent
MATCHES_FILE = BASE_DIR / "matches.json"
def load_matches(path=MATCHES_FILE):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def match_time(match):
source_tz = ZoneInfo(match["timezone"])
local_time = datetime.fromisoformat(
f'{match["date"]}T{match["time"]}'
)
return local_time.replace(tzinfo=source_tz)
def convert_time(match, target_timezone):
return match_time(match).astimezone(ZoneInfo(target_timezone))
def find_by_team(matches, team_name):
team_name = team_name.lower()
return [
match for match in matches
if team_name in match["team_a"].lower()
or team_name in match["team_b"].lower()
]
def find_by_date(matches, date, target_timezone="Asia/Shanghai"):
return [
match for match in matches
if convert_time(match, target_timezone).strftime("%Y-%m-%d") == date
]
def format_match(match):
beijing_time = convert_time(match, "Asia/Shanghai")
eastern_time = convert_time(match, "America/New_York")
return f"""
比赛:{match["team_a"]} vs {match["team_b"]}
阶段:{match["stage"]} / {match["group"]}
地点:{match["venue"]}, {match["city"]}
当地时间:{match["date"]} {match["time"]} ({match["timezone"]})
北京时间:{beijing_time.strftime("%Y-%m-%d %H:%M")}
美东时间:{eastern_time.strftime("%Y-%m-%d %H:%M")}
""".strip()
def main():
parser = argparse.ArgumentParser(description="世界杯赛程小助手")
parser.add_argument("--team", help="按球队查询,比如 Mexico")
parser.add_argument("--date", help="按北京时间日期查询,比如 2026-06-19")
args = parser.parse_args()
matches = load_matches()
if args.team:
results = find_by_team(matches, args.team)
elif args.date:
results = find_by_date(matches, args.date)
else:
results = matches
if not results:
print("没有找到相关比赛")
return
for match in results:
print(format_match(match))
print("-" * 40)
if __name__ == "__main__":
main()
date 去比较。date 是比赛举办地日期,但用户输入的
--date,我们希望它代表北京时间日期。所以程序会先把每场比赛转成北京时间,再取出转换后的日期,和用户输入的日期做比较。2026-06-18 19:00 的比赛,如果换成北京时间是
2026-06-19 09:00,就会被归到北京时间
2026-06-19 这一天。[
{
"id": "match_001",
"match_no": 1,
"date": "2026-06-11",
"time": "13:00",
"timezone": "America/Mexico_City",
"team_a": "Mexico",
"team_b": "South Africa",
"stage": "First Stage",
"group": "Group A",
"venue": "Mexico City Stadium",
"city": "Mexico City",
"source": "FIFA / MLS Soccer"
},
{
"id": "match_002",
"match_no": 2,
"date": "2026-06-11",
"time": "20:00",
"timezone": "America/Mexico_City",
"team_a": "Korea Republic",
"team_b": "Czechia",
"stage": "First Stage",
"group": "Group A",
"venue": "Estadio Guadalajara",
"city": "Guadalajara",
"source": "FIFA / MLS Soccer"
},
{
"id": "match_003",
"match_no": 3,
"date": "2026-06-18",
"time": "12:00",
"timezone": "America/New_York",
"team_a": "Czechia",
"team_b": "South Africa",
"stage": "First Stage",
"group": "Group A",
"venue": "Atlanta Stadium",
"city": "Atlanta",
"source": "FIFA / MLS Soccer"
},
{
"id": "match_004",
"match_no": 4,
"date": "2026-06-18",
"time": "19:00",
"timezone": "America/Mexico_City",
"team_a": "Mexico",
"team_b": "Korea Republic",
"stage": "First Stage",
"group": "Group A",
"venue": "Estadio Guadalajara",
"city": "Guadalajara",
"source": "FIFA / MLS Soccer"
},
{
"id": "match_005",
"match_no": 5,
"date": "2026-06-24",
"time": "19:00",
"timezone": "America/Mexico_City",
"team_a": "Czechia",
"team_b": "Mexico",
"stage": "First Stage",
"group": "Group A",
"venue": "Mexico City Stadium",
"city": "Mexico City",
"source": "FIFA / MLS Soccer"
},
{
"id": "match_006",
"match_no": 6,
"date": "2026-06-24",
"time": "19:00",
"timezone": "America/Monterrey",
"team_a": "South Africa",
"team_b": "Korea Republic",
"stage": "First Stage",
"group": "Group A",
"venue": "Estadio Monterrey",
"city": "Monterrey",
"source": "FIFA / MLS Soccer"
}
]
python3 worldcup_helper.py --team Mexico

python3 worldcup_helper.py --date 2026-06-18

2026-06-18,但换算成北京时间后已经是
2026-06-19。所以输入
2026-06-18 查不到比赛,输入
2026-06-19 才能查到这两场。--date 设计成本地观赛日期的原因:我们关心的是“我这一天能看哪些比赛”,而不是比赛举办地的日期。matches.json 里所有比赛:python3 worldcup_helper.py

当地日期 当地时间 比赛所在时区 对阵球队 比赛城市 比赛场馆
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050060/viewspace-3173716/ ,如需转载,请注明出处,否则将追究法律责任。