我开发了一个 SAP UI5 应用,使用了数据类型 sap.ui.model.type.Date
,并且指定了显示格式 pattern
为:yyyy-MM-ddTHH:mm:ss
:
<ObjectAttribute title="{i18n>dateTitle}" text="{
path: 'invoice>ShippedDate',
type: 'sap.ui.model.type.Date',
formatOptions: {
style: 'long',
source: {
pattern: 'yyyy-MM-ddTHH:mm:ss'
}
}
}"/>
这个字段绑定的数据源的值为:2015-04-01T01:20:59
我期望在 SAP UI5 上显示的格式为 某年-某月-某日-T-小时-分-秒
,但是最后的显示效果如下图:April 1,2015
本文介绍如何分析这个显示格式的问题。
在前一篇文章,我们已经排除了这个问题是由于数据解析错误造成的,因为在 DateFormat.js
的 _format 方法输入参数 oJSDate
,已经能够观察到正确从本地 JSON 文件解析出的包含了小时,分,秒
的时间值:Thu Apr 02 2015 01:20:30 GMT+0800 (China Standard Time)
this.aFormatArray
只包含了五条记录,不含小时,分,秒,因此最后输出的时间只有年月日。
分析 aFormatArray
的数据源:
this.aFormatArray = this.parseCldrDatePattern(this.oFormatOptions.pattern);
运行时调试:this.oFormatOptions.pattern 的值为 MMddyyyy
我们在 xml 视图里指定的 pattern,可以在 callstack 里看到:
XML 视图地址,位于 一套适合 SAP UI5 开发人员循序渐进的学习教程 步骤第 34:
pattern: 'yyyy-MM-ddTHH:mm:ss'
我们 xml 视图里只提供了 source-pattern,而不是 pattern,因此,SAP UI5 框架,需要调用如下代码来生成 pattern:
oFormat.oFormatOptions.pattern = oInfo.getPattern(oFormat.oLocaleData, oFormat.oFormatOptions.style, oFormat.oFormatOptions.calendarType);
从 SAP UI5 生成 Pattern
的逻辑来查看,我们 xml 视图里提供的 pattern 没有作为输入参数被考虑:
getDatePattern: function(sStyle, sCalendarType) {
assert(sStyle == "short" || sStyle == "medium" || sStyle == "long" || sStyle == "full", "sStyle must be short, medium, long or full");
return this._get(getCLDRCalendarName(sCalendarType), "dateFormats", sStyle);
},
style 支持 full,而我指定的是 long
.
如果设置成 full,显示效果如下:Thursday, April 2, 2015