From 04631ba8e4511029d7f7add04afd6f6954fdb372 Mon Sep 17 00:00:00 2001 From: ztcools <3614644417@qq.com> Date: Thu, 30 Jul 2026 15:07:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(weibo):=20=E4=BF=AE=E5=A4=8D=20RFC2822=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=BD=AC=E6=8D=A2=E4=B8=A2=E5=BC=83=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E5=81=8F=E7=A7=BB=E5=AF=BC=E8=87=B4=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=88=B3=E6=99=9A=208=20=E5=B0=8F=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rfc2822_to_timestamp 先用 %z 解析出带偏移的 datetime,再用 replace(tzinfo=timezone.utc) 处理。replace 只是覆盖 tzinfo 而不做换算, +0800 的时间被当成 UTC,算出的时间戳比真实时间晚 8 小时。 改用 astimezone(timezone.utc) 做真正的时区换算,与紧邻上方的 rfc2822_to_china_datetime 保持一致。 影响 store/weibo 落库的 create_time 字段(帖子与评论各一处)。同一条记录里 create_time 与 create_date_time 会相差 8 小时,跨日内容的日期还会整体偏移 一天。 补两条离线单测:一条断言 +0800 输入对应的时间戳,一条断言 create_time 与 create_date_time 指向同一时刻。两条测试在修复前均失败。 --- test/test_utils.py | 13 +++++++++++++ tools/time_util.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/test/test_utils.py b/test/test_utils.py index cd0b08a..f42da21 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -47,3 +47,16 @@ async def test_convert_browser_context_cookies_uses_url_filter(): browser_context.cookies.assert_awaited_once_with(urls=["https://www.douyin.com"]) assert cookie_str == "sessionid=abc" assert cookie_dict == {"sessionid": "abc"} + + +def test_rfc2822_to_timestamp_converts_utc_offset(): + # 2023-12-23 17:12:54 +0800 == 2023-12-23 09:12:54 UTC == 1703322774 + assert utils.rfc2822_to_timestamp("Sat Dec 23 17:12:54 +0800 2023") == 1703322774 + + +def test_rfc2822_to_timestamp_agrees_with_china_datetime(): + rfc2822_time = "Sat Dec 23 17:12:54 +0800 2023" + + assert utils.rfc2822_to_timestamp(rfc2822_time) == int( + utils.rfc2822_to_china_datetime(rfc2822_time).timestamp() + ) diff --git a/tools/time_util.py b/tools/time_util.py index 5777bae..d157f98 100644 --- a/tools/time_util.py +++ b/tools/time_util.py @@ -118,7 +118,7 @@ def rfc2822_to_timestamp(rfc2822_time): dt_object = datetime.strptime(rfc2822_time, rfc2822_format) # Convert datetime object to UTC time - dt_utc = dt_object.replace(tzinfo=timezone.utc) + dt_utc = dt_object.astimezone(timezone.utc) # Calculate Unix timestamp from UTC time timestamp = int(dt_utc.timestamp())