sap.ui.core.format.DateFormat.format给出错误的日期

时间:2018-08-16 06:44:29

标签: sapui5

对于一个客户端,仅当将浏览器切换为英语时,以下代码:

convertTimeToDate: function(dateobj) {


            if ((dateobj == undefined) || (dateobj == null)) {
                return "";
            }


            var dateFormat = sap.ui.core.format.DateFormat.getDateInstance({
                pattern: "dd. MMM YYYY"
            });

            var dateFormatted = dateFormat.format(dateobj);

           return dateFormatted;
},
输入日期日期字符串'31的最高日期'9999-12-31'时返回

。 Dec 10000'可能是什么问题?它只能在这个人的机器上重现,但对她来说总是如此。

3 个答案:

答案 0 :(得分:2)

为了避免时区问题,尤其是在HR中的UI5应用程序中,我决定在最近的开发中以字符串形式发送/接收ISO格式的日期和时间,以确保浏览器中的用户将看到与SAP后端系统。

为确保将这些值同时用于输入和输出,建议实施Custom Data Type

假设您有一个sap.m.DateRangeSelection,它接受JavaScript Date对象作为 dateValue secondDateValue ,并且要将这些属性绑定到模型,其中的属性如< strong> startDate 和 endDate 是yyyy-MM-dd模式的日期字符串。 在这种情况下,示例自定义数据类型可以像这样:

sap.ui.define([
	"sap/ui/model/SimpleType",
	"sap/ui/core/format/DateFormat"
], function(SimpleType, DateFormat) {
	"use strict";
	return SimpleType.extend("MyProject.model.ISODateType", {
		
    /**         
		 * Converts JavaScript Date object to ISO date string    
		 *         
		 * @public         
		 * @param {string} sISO the ISO value of the formatted property         
		 * @returns {string}     
		 */parseValue: function(oDate) {
			var oFormat = DateFormat.getDateInstance({
				pattern: "yyyy-MM-dd"
			});
			return oFormat.format(oDate);
		},
		/**         
		 * Produces JavaScript Date object from ISO date string    
		 *         
		 * @public         
		 * @param {string} sISO the ISO value of the formatted property         
		 * @returns {string}     
		 */
		formatValue: function(sValue) {
			return new Date(sValue);
		},
		/**         
		 * Validates the value to be parsed (should be ISO date string)        
		 *         
		 * @public         
		 * no client side validation is required        
		 * @returns {boolean} true         
		 */
		validateValue: function(sValue) {
			var sPattern = /(\d{4})-(\d{2})-(\d{2})/;
			return sValue.match(sPattern);
		}
	});
});

XML视图中的绑定看起来像这样:

<DateRangeSelection
                width="30%"
                dateValue="{
                    path: '/startDate',
                    type: 'MyProject.model.ISODateType'
                }"
                secondDateValue="{
                    path: '/endDate',
                    type: 'MyProject.model.ISODateType'
                }"
                change="onDateIntervalChange"/>

答案 1 :(得分:2)

我也被同样的10k日期困扰。我的模式是{pattern: 'MMMM Y'}。将其更改为{pattern: 'MMMM yyyy'}可解决此问题。我找不到关于“ Y”和“ y”之间差异的任何文档。

答案 2 :(得分:1)

只是一个主意:用户在浏览器和时区中所做的任何操作(无论如何)对于他/她来说都是有所不同。您在试玩期间尝试通过固定时区吗?好像增加了几秒钟..也许有一些转换偏移量之类的。

https://openui5.hana.ondemand.com/#/api/sap.ui.core.format.DateFormat/methods/sap.ui.core.format.DateFormat.getDateInstance @since 1.34.0包含模式符号(例如“ yMMMd”或“ Hms”),这些模式符号将转换为使用的语言环境中的模式,该模式与所需的符号最匹配。这些符号必须按规范顺序排列,即:时代(G),年份(y / Y),季度(q / Q),月份(M / L),星期(w / W),周几( E / e / c),日期(d / D),小时(h / H / k / K / j / J),分钟(m),秒(s),时区(z / Z / v / V / O / X / x)参见http://unicode.org/reports/tr35/tr35-dates.html#availableFormats_appendItems

类似:https://gist.github.com/bvanzyl/b3b64306a7363f0b3e043608b48d8326

formatDateStr: function(data){
             if(data === null || data === undefined){
                    return data;
             }else{
                    var oDate = new Date(data);
                    var iLocalTime = oDate.getTime();
                    // Berlin timezone = UTC+1 = 1hr = 60min ahead 
                    // 60min * 60000 for time in milliseconds
                    var iBerlinOffset = 60 * 60000;
                    var iLocalOffset = oDate.getTimezoneOffset() * 60000;
                    var iBerlinTime = iLocalTime + iLocalOffset + iBerlinOffset;
                    oDate.setTime(iBerlinTime);
                    var dateFormat = sap.ui.core.format.DateFormat.getDateInstance({pattern : "MMM, dd YYYY" });  
                    var dateFormatted = dateFormat.format(oDate);
                    return  dateFormatted;
             }
       }
   };