【问题标题】:How to handle Edm:DateTime form OData interface in SAPUI5 correct?如何正确处理 SAPUI5 中的 Edm:DateTime 表单 OData 接口?
【发布时间】:2015-07-08 12:45:40
【问题描述】:

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

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

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

new sap.m.DatePicker({
     value : {
         path : "BirthDate",
         type : new sap.ui.model.type.Date
     }
}),

你如何解决这些问题?

编辑

时区处理对我来说似乎仍然很陌生。 SAP 网关服务器发送 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",
                })
    }
})

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

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

如果我将它发送到服务器,我得到 Edm.DateTime == 2015-04-16T00:00:00 控制显示: 2015 年 4 月 16 日星期四 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit)

如果我使用

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

数据似乎正确(选择新日期后的 2 小时没有丢失)。

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

很奇怪,我在使用过滤器时遇到了类似的问题。但是那里的 UTC 标志似乎不起作用。

有人对这个话题有一些经验吗?或者有什么好的文档提示? * https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/91f3070d6f4d1014b6dd926db0e91070.html 或多或少说“保重”,但不说如何:-/

更多信息

我在 SAP 网络 (http://scn.sap.com/thread/3574419) 上检测到了同样的问题。不确定给定的答案是否正确。看起来像是在不应该要求的元数据中四处乱窜?

我仍在寻找解决此问题的方法

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

【问题讨论】:

标签: datetime sapui5


【解决方案1】:

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

new sap.m.DatePicker({
     dateValue : "{BirthDate}"
})

【讨论】:

  • 绑定本身正在工作,但看起来时区处理不正确。我从服务器收到一个日期,该日期将映射到正确的时间,使用日期选择器更改日期将更改日期并将时间部分设置为零。存储此日期会将日期更改为所选日期之前的日期。我认为这是一个时区问题。问题是,正确的做法是什么?
【解决方案2】:

使用类型sap.ui.model.type.Date({ oFormatOptions:{ style: "short", UTC: true} }) 这将保留服务器发送的日期

【讨论】:

    【解决方案3】:

    由于我不熟悉,所以我无法回答关于 SAP 的问题。但我可以提供一些基于 OData 的见解。

    Edm:DateTime 类型基于W3C XML Schema xs:dateTime,而ISO8601 又基于ISO8601。 XML Schema 和 ISO8601 都声明没有时区的时间被视为“本地时间”。也就是说,对某人来说是本地的。故意未定义其“本地”。

    来自 W3C XML Schema §3.2.7:

    “本地”时间或非时区时间假定为相应法律机构规定的某个未指定地区的时区时间

    来自 ISO 8601 第 3 版 §4.3.2:

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

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

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

    还要考虑到,生日最好只用日历日期来表示,而不是用某个日期的午夜来表示。 Edm:Date 类型更适合于此。对于其他类型,特别是如果您知道该值为 UTC 或在特定时区,那么Edm:DateTimeOffset 更合适。

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

    希望对您有所帮助。

    【讨论】:

    • Edm:Datewas added in OData V4.0, replacing DateTime。在编写 SAP Gateway 时,仍然使用 V2(带有 V4 的注释)。虽然 OData 实施正在积极开发中,但没有已知计划对其进行大规模改造以支持 V4。鉴于 DateTime 从 V4 中消失的影响,这不太可能发生,尽管他们可能会将 Date 添加到他们的实施中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多