原时间字段保持兼容,新增 UTC Unix 毫秒时间戳;显示时区由客户端决定。
时间与时区
绝对时刻
响应中的绝对时刻保留现有字段、类型和含义,同时新增 原字段名加 _ms 的字段。新增值为 JSON 整数,OpenAPI 类型为 integer、格式为 int64,单位固定为毫秒,表示自 1970-01-01T00:00:00Z 起经过的毫秒数,不携带地区时区。
{
"created_at": "2026-09-14T08:05:08.680Z",
"created_at_ms": 1789373108680
}
同一时刻在上海为 2026-09-14 16:05:08.680,在 UTC 为 2026-09-14 08:05:08.680。不要给时间戳加减八小时。仅在最终展示时根据设备或用户选择的时区格式化。夏令时使用系统时区规则处理,不用固定小时偏移代替地区时区。
规则适用于对象、列表及嵌套 DTO,例如 created_at_ms、updated_at_ms、occurred_at_ms、expires_at_ms、时间线的 at_ms、汇率的 as_of_ms。驼峰旧字段也不改名,例如 createdAt 对应 createdAt_ms。已有同名 _ms 字段不被覆盖。
原值为空或已识别的时间字段无法安全解析时,新增值为 null,不使用 0 或当前时间代替。带时区的 ISO 时间支持小数秒和不带小数秒;超过毫秒的精度截取至毫秒。没有时区的时间字符串不会被擅自解释为 UTC 或服务器本地时间。
旧的秒级字段
令牌、KYC 会话及提权会话既有的 expired_at、expires_at 数字仍为 Unix 秒,只将其新增的 _ms 字段转换为毫秒。不要改变旧字段的读取方式。未知单位的数字不根据位数推断,也不自动乘以 1000。
不转换的字段
- 生日、证件有效期、起息日、到期日、结算业务日等
YYYY-MM-DD纯日期不是绝对时刻,不新增伪造的午夜时间戳。 - 时长、TTL、重试间隔、倒计时秒数等不是时间点,原单位保持不变。
- 请求字段、JWT 声明、签名头和签名协议的时间戳单位保持不变。
- 调用方
metadata、上游原文、原始请求/响应、签名载荷和 schema 等不作为业务 DTO 改写。 - 二进制文件、流式响应、供应商回调协议及数据库内部执行接口不执行此投影。
Webhook 与重放
新生成的商户 Webhook 在入队前补齐时间字段,随后对最终载荷签名和发送。重试使用队列中同一份载荷,不因当前时间或设备时区重新生成时间值。已入队的历史 Webhook 不回写,以免改变在途载荷或签名输入。
接口幂等重放可对历史 JSON 响应补充相同的派生时间戳,原业务字段保持不变,不会再次执行业务,也不会使用重放时刻替换原事件时间。接入方应忽略未知响应字段,不依赖 JSON 属性数量或字节级顺序。
客户端展示
推荐优先读取新增的 _ms 字段;兼容旧版本服务端时,可以回退解析带时区的原 ISO 字段。iOS 的 Unix 时间构造函数使用秒,因此需要将毫秒除以 1000 后构造 Date。设备时区控制钟表时间和按日分组,App 语言控制日期文字和排列方式。App 切回前台或设备时区变化时,应重新格式化已有时间,不重新创建业务记录。