直接答案:如果你的服务器在中国、仓库在美国,而代码里用了"服务器本地时间"生成报文日期,那么每天下午之后发的 ASN,日期都会比美国实际日期早一天——商超会以 "future date" 或 "incorrect date" 拒收。
事故现场
零售商反馈一批 ASN 的发货日期"不正确"。核对仓库记录:货确实在当天装车发出,没有任何延误。报文内容、格式、SSCC 全部正确——问题出在日期本身。
根因:中国的"明天",是美国的"今天"
系统服务器在中国(UTC+8),仓库在美西(UTC-7/-8)。中国时间凌晨 1 点生成报文时,代码取"今天"得到的是中国日期——而此刻美西还是前一天上午。写进 856 的发货日期,比美国实际日期早了一天,在零售商看来这批货"未来才发出"。
| 时刻 | 中国时间 | 美西时间 | naive 代码取到的日期 |
|---|---|---|---|
| 装车发货 | 7 月 16 日 01:00 | 7 月 15 日 10:00 | 07-16 ❌(应为 07-15) |
怎么根治
- 所有对外报文的日期时间,一律指定业务时区(美西仓就用 America/Los_Angeles)生成,禁止用服务器本地时间;
- 用 IANA 时区名而不是写死 UTC 偏移——夏令时切换会让 -8:00 变 -7:00;
- 定时任务判断"今天该发什么",同样按业务时区取日期;
- 上线前专测跨日场景:中国半夜、美西下午,是最容易露馅的时段。
诊断口诀:零售商说 "future date",八成是时区。先查报文生成时刻的服务器时区,再查代码里有没有裸的"取当前时间"。