MENU

泛微E10国际化与日期字段 displayFormat 冲突排查实录

• 2026 年 03 月 03 日 • 阅读: 4 • 躺过的坑

同一日期字段为什么会显示两种格式?泛微国际化与 displayFormat 冲突排查实录(Ecology10 v10.0.2512.01)

这次踩坑很典型。
同一个流程、同一个节点、同一个日期字段,一个请求显示 March 3, 2026,另一个却是 17-02-2026
结论先说:不是数据源问题,是“全局国际化日期”与“字段 displayFormat”在前端渲染链路冲突了。
如果你也在做泛微国际化,尤其还叠加了 ecode,这篇基本可以直接对照排查。

你可以直接拿走的结论

前端先按全局规则预格式化日期,再按字段 displayFormat 二次格式化;二次解析对部分值失败后会回退原值,导致同一日期字段出现两种显示格式,甚至月日互换。

环境信息

  • 产品基线版本:10.0.2512.01
  • 全局设置:范围国际化日期开启 MM-DD-YYYY
  • 字段设置:日期字段开启显示格式 MMMM D, YYYY
  • 自定义适配:已用 ecode 适配 MMM(英文简写月)
  • 对比请求:
  • 1240131189385469953,显示 March 3, 2026
  • 1234471942773547020,显示 17-02-2026

问题现象

同一个日期字段,显示结果不一致:

  1. 一条请求是英文月份格式:March 3, 2026
  2. 另一条请求是数字格式:17-02-2026

第一眼很像“后端给了不同格式的数据”。
但这次不是。

排查过程

1) 先看 DOM:是不是同一个组件在渲染

两个页面都是同一个 widget:

  • #widget_1083772471125450753
  • 值都在 .weapp-form__display-format-view > span

说明不是“一个是日期组件、一个是文本组件”的差异。

2) 再看 API:字段配置是否漂移

核心接口:

POST /api/ebuilder/flow/form/core/getFormDataAndLayout?formId=1134626576188694691&dataId=...

两条请求里,日期字段配置一致:

{
  "fieldId": "1083772471125450753",
  "dataKey": "letter_date",
  "columnName": "letter_date",
  "format": "yyyy-MM-dd",
  "displayFormatConfig": {
    "formatter": {
      "type": "date",
      "setting": { "type": "MMMM D, YYYY" }
    }
  }
}

只有原始值不同:

  • 124013... -> content = 2026-03-03
  • 123447... -> content = 2026-02-17

所以可以排除“数据源不一致”和“字段配置不一致”。

3) 最后看 JS:前端到底怎么格式化

前端关键链路(weappFormbuilder 运行时模块):

// 简化逻辑
h = formatByConfig(rawValue, config.format) // 先预格式化
y = Convert.parse(h, displayFormat)         // 再二次格式化

Convert.parseDate 内部是 dayjs(e).format(...)
如果 e 解析失败,就会原样回退 e

核心冲突点

全局国际化先把值改造成了某种字符串形态,字段 displayFormat 再次解析时并不总是成功。
成功了就显示英文月名,失败了就回退原串。

为什么一个能转,另一个不能转?

直观看两个值:

  1. 2026-03-03
    预处理后是 03-03-2026,前端还能“猜”成有效日期,最后渲染出 March 3, 2026。也就是说:
  2. 2026-02-17
    预处理后是 17-02-2026,前端解析失败(17 不能当月份),于是回退成 17-02-2026

这就是“同一日期字段,两种格式”的直接原因。

这事不只是显示不统一,还可能显示错误日期

模拟结果里还能看到月日互换风险:

  • 2026-12-01(12月1日)会被转换为 January 12, 2026(1月12日)

这已经不是样式问题,是语义错误。

为什么这次 ecode 没兜住

针对泛微当前版本的国际化日期转换只能支持MMDD固定的组合方式,我们用 ecode 适配了MMMMMMM英文月份格式, ecode 适配本身没问题。
问题在于这条链路里,前端在某些值上先“退化成普通字符串输出”,导致后续不再稳定走日期组件的转换路径。
所以表现就是:你写了转换,但它没机会生效。

关键点:宿主前端在“国际化 + 字段格式”叠加时,输出路径不稳定。

总结

这次问题本质上是格式链路冲突,不是数据源问题。
全局国际化、字段 displayFormat、ecode 三者叠加时,10.0.2512.01 这条链路确实有适配缺口。
真正的修复方向不是继续补字符串转换,而是统一日期输入语义和格式化入口。

一句话收尾:
日期问题出现“双重格式化”时,别猜,直接抓 DOM + API + 运行时函数,效率最高。