如何在SAPUI5中处理Edm:DateTime表单OData接口是否正确?

use*_*327 6 datetime sapui5

是否有定义应在OData Edm中发送哪些值:SAP Netweaver Gateway服务的DateTime?特别是它应该总是被解释为UTC?

我假设SAPUI5库足够智能,如果接口定义正确,自动处理所有这些时区问题 - 问题是,什么是正确的?

我更喜欢在客户端使用这样的代码:

new sap.m.DatePicker({
     value : {
         path : "BirthDate",
         type : new sap.ui.model.type.Date
     }
}),
Run Code Online (Sandbox Code Playgroud)

你是如何解决这些问题的?

编辑

时区处理对我来说似乎仍然很奇怪.SAP Gateway Server在Edm:DateTime中发送以下内容:2015-04-16T00:00:00缺少任何时区信息.

如果我绑定这样的日期选择器:

var oContent = new sap.m.DatePicker({
    value : {
        path : "Date",
        type : new sap.ui.model.type.Date({
                    style: "short",
                })
    }
})
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:16.04.15(似乎是正确的).绑定没有类型信息的日期选择器显示:Thu Apr 16 2015 02:00:00 GMT + 0200(MitteleuropäischeSommerzeit)

如果我将日期选择器的日期更改为17.04.15,则第二行是:2015年4月17日星期五00:00:00 GMT + 0200(MitteleuropäischeSommerzeit)请注意时间差异(缺少2小时).

如果我把它发送到服务器我得到了Edm.DateTime == 2015-04-16T00:00:00控制显示:Thu Apr 16 2015 02:00:00 GMT + 0200(MitteleuropäischeSommerzeit)

如果我使用

new sap.m.DatePicker({
value : {
    path : "Date",
    type : new sap.ui.model.type.Date({
                style: "short",
                UTC: true
        })
}
})
Run Code Online (Sandbox Code Playgroud)

数据似乎是正确的(选择新日期后2小时不会丢失).

我问我,有什么类型的数据网关会发送什么定义?如果Edm.DateTime信息中缺少时区,客户端应如何正常工作?特别是如果客户在不同的时区可用?

很奇怪我使用过滤器有类似的问题.但是那里的UTC标志似乎不起作用.

有关该主题的一些经验的人吗?或任何提供良好文档的提示?*https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/91f3070d6f4d1014b6dd926db0e91070.html 说或多或少"照顾"但不是如何: - /

更多的信息

我在SAP网络上检测到了同样的问题(http://scn.sap.com/thread/3574419).不确定给定的答案是否正确.看起来像是在不需要的元数据中进行黑客攻击?

我仍在寻找这个问题的解决方案

在绑定和过滤器使用情况下,我检测到了不同的数据处理.

Mat*_*int 5

关于SAP,我无法回答,因为我不熟悉.但我可以根据OData提供一些见解.

Edm:DateTime类型基于W3C XML Schemaxs:dateTime,后者基于ISO8601.XML Schema和ISO8601都声明没有时区的时间被认为是"本地时间".那就是某人的本地人.其"本地"是故意未定义的.

从W3C XMLSchema§3.2.7开始:

"当地"或未定时时间被假定为适当法律机构规定的某些未指明地点的时区时间

来自ISO 8601第3版§4.3.2:

如果使用当地时间,区域指示符为空...

考虑你的例子2015-04-16T00:00:00.了解这指的确切时刻的唯一方法是应用一些额外的上下文.在生日的情况下,这可以是该人当前所在的时区(他们在哪里庆祝他们的生日,而不是他们出生的地方).或者,如果该人的位置未知,则可能是某个任意位置 - 可能是使用该系统的人的时区.

因此,对值的解释是应用时区的位置.在您的情况下,似乎在反序列化期间正在应用某个本地时区.

还要考虑只有日历日期而不是日期的午夜才能更好地表示生日.这种Edm:Date类型更适合这种情况.对于其他类型,特别是如果您知道值是UTC或在特定时区,Edm:DateTimeOffset则更合适.

还要认识到该Edm:DateTime类型已从版本4.0中的OData规范中删除.许多人(包括我自己)认为这是一个错误.我不确定这是否会影响你,但你应该知道.

希望有所帮助.


小智 3

您可以尝试将日期路径绑定到 dateValue 而不是 value。它应该自动解释 Edm:DateTime。

new sap.m.DatePicker({
     dateValue : "{BirthDate}"
})
Run Code Online (Sandbox Code Playgroud)