Skip to content

[Bug] 海外区服的换日锚点固定为东4区,日常代理状态与计划表全部错位 #463

Description

@qiyinxi

问题

用户配置里有 Info/Server,明日方舟支持 Official / Bilibili / YoStarEN / YoStarJP / YoStarKR / txwyapp/utils/constants.py:125 起),但它从不参与任何日期计算——换日锚点 UTC4 是无条件写死的。

# app/utils/constants.py:29
UTC4 = timezone(timedelta(hours=4))

Info/Server 的全部读取点都用于包名映射与登录流程,没有任何一处进入日期判断。受影响的日期逻辑:

位置 用途
各脚本 AutoProxycurdate LastProxyDate / ProxyTimes 归零判定
RemainedDay 扣减 剩余天数
app/models/config.py:2649:2688 计划表周模式取当天配置
app/core/config.py:1995 资源本开放日 isoweekday()(仅影响 UI 下拉框标签,不进入运行)

为什么这是结构性缺陷

东 4 区零点等价于「服务器 UTC+8、04:00 换日」。各区服的服务器时区不同:

区服 服务器时区 若 04:00 换日则锚点应为 MAS 实际使用
官服 / B服 / txwy UTC+8 UTC+4 UTC+4 ✅
YoStarJP / YoStarKR UTC+9 UTC+5 UTC+4 ❌
YoStarEN 待确认 待确认 UTC+4 ❌

YoStarEN 的服务器时区、以及是否随美西夏令时漂移,我没有权威来源,标为待确认。本 issue 只断言结构性事实:无论各区服的正确锚点是什么,对所有区服一律使用 UTC+4 都不可能同时正确。

影响

以偏差最大的 YoStarEN 为例:MAS 认为游戏日在 UTC+4 零点翻页,服务器实际换日在另一个时刻。两者错开多少小时,就有多长的窗口出现以下问题:

  • LastProxyDateProxyTimes 在游戏日中途归零 → 同一游戏日内重复跑
  • ProxyTimesLimit(代理次数上限)形同虚设
  • RemainedDay 在错误的时刻扣减
  • 计划表周模式取到相邻一天的配置
  • 用户列表「今日已代理」标签与实际不符

对国服 / B服 / txwy 用户无影响。

对照:数据侧已经有区服时区概念

活动关卡的期间判断已经正确地按区服取时区:

# app/models/config.py(活动关卡)
activity_timezone = timezone(timedelta(hours=activity.get("TimeZone", 8)))
if (datetime.strptime(activity["UtcStartTime"], "%Y/%m/%d %H:%M:%S").replace(tzinfo=activity_timezone)
        < datetime.now(tz=activity_timezone) < ...):

也就是说时区信息在数据层已经存在,只是日常状态与计划表逻辑没有接上。

建议

引入 Server → 换日锚点 映射表,把以下三处改为按用户区服取时区:

  1. 各脚本 AutoProxycurdate / LastProxyDate / ProxyTimes / RemainedDay
  2. 计划表周模式的当天判定(app/models/config.py:2649:2688
  3. 资源本开放日(app/core/config.py:1995

落地前需要先确认各区服的实际换日时刻,尤其是 YoStarEN 是否随美西夏令时变化——如果会,映射表就不能是固定偏移,得用具名时区。

环境

  • 上游 dev @ 9e6b0d0a(2026-08-30)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions