web-dev-qa-db-ja.com

SAPUI5でEdm:DateTimeフォームODataインターフェースを正しく処理する方法は?

SAP NetweaverGatewayサービスのODataEdm:DateTimeで送信する値の定義はありますか?特にそれは常にUTCとして解釈されるべきですか?

SAPUI5ライブラリは、インターフェイスが正しく定義されていれば、このタイムゾーンの問題をすべて自動的に処理するのに十分スマートだと思います。質問は、何が正しいのかということです。

クライアント側では、次のようなコードを使用したいと思います。

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

これらの問題をどのように解決しますか?

編集

タイムゾーンの処理はまだ私には奇妙に思えます。 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",
                })
    }
})

次の出力が得られました:16.04.15(正しいようです)。タイプ情報なしで日付ピッカーをバインドすると、次のように表示されます。2015年4月16日木曜日02:00:00 GMT + 0200(MitteleuropäischeSommerzeit)

日付ピッカーを使用して日付を17.04.15に変更すると、2行目は次のようになります。2015年4月17日金曜日00:00:00 GMT + 0200(MitteleuropäischeSommerzeit)時間の違いに注意してください(2時間欠落)。

サーバーに送信すると、Edm.DateTime == 2015-04-16T00:00:00コントロールが表示されます:2015年4月16日木曜日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
        })
}
})

データは正しいようです(新しい日付を選択してから2時間は欠落していません)。

私は私に尋ねています、どのタイプのデータゲートウェイが送信するかについての定義はありますか? Edm.DateTime情報内にタイムゾーンがない場合、クライアントはどのように正しく機能する必要がありますか?特に、クライアントが利用可能な異なるタイムゾーンにいる場合はどうでしょうか。

不思議なことに、フィルターを使用しても同様の問題が発生します。しかし、UTCフラグが機能していないようです。

そのトピックに関する経験のある人はいますか?または、優れたドキュメントへのヒントはありますか? * https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/91f3070d6f4d1014b6dd926db0e91070.html 多かれ少なかれ「気をつけて」と言いますが、方法は言いません:-/

さらに詳しい情報

SAPネットワークで同じ質問を検出しました( http://scn.sap.com/thread/3574419 )。与えられた答えが正しいかどうかわからない。必要ではないメタデータをハッキングしているように見えますか?

私はまだこの問題の解決策を探しています

バインディングとフィルターの使用の場合、データの異なる処理を検出しました。

7
user3783327

私はよく知らないので、SAPに関して答えることができません。しかし、ODataに基づいていくつかの洞察を提供することができます。

Edm:DateTimeタイプは W3CXMLスキーマxs:dateTime に基づいており、これは ISO8601 に基づいています。 XMLスキーマとISO8601はどちらも、タイムゾーンのない時間は「現地時間」と見なされると述べています。つまり、誰かにローカルです。その「ローカル」は意図的に定義されていません。

W3C XMLスキーマ§3.2.7から:

「ローカル」またはタイムゾーン化されていない時間は、適切な法的機関によって規定されている、特定されていない地域のタイムゾーン内の時間であると推定されます。

ISO 86013rdEdition§4.3.2から:

現地時間を使用する場合、ゾーン指定子は空です...

2015-04-16T00:00:00の例を考えてみましょう。これが参照するexactの瞬間を知る唯一の方法は、いくつかの追加のコンテキストを適用することです。誕生日の場合、これはその人が現在いるタイムゾーン(生まれた場所ではなく、誕生日を祝う場所)である可能性があります。または、人の場所が不明な場合は、任意の場所である可能性があります。おそらく、システムを使用している人のタイムゾーンです。

したがって、値の解釈は、タイムゾーンが適用されている場所です。あなたの場合、逆シリアル化中にいくつかのローカルタイムゾーンが適用されているように見えます。

また、誕生日は、日付の深夜ではなく、カレンダーの日付だけで表す方がよいと考えてください。これには、Edm:Dateタイプの方が適しています。他のタイプの場合、特に値がUTCまたは特定のタイムゾーンであることがわかっている場合は、Edm:DateTimeOffsetの方が適切です。

また、バージョン4.0ではEdm:DateTimeタイプがOData仕様から削除されたことを認識してください。多くの人(私を含む)はこれを間違いだと考えています。これがあなたに影響を与えるかどうかはわかりませんが、注意する必要があります。

お役に立てば幸いです。

5

タイプsap.ui.model.type.Date({ oFormatOptions:{ style: "short", UTC: true} })を使用します。これにより、サーバーから送信された日付が保持されます。

4
Sunil B N

日付パスを値ではなくdateValueにバインドしてみてください。 Edm:DateTimeを自動的に解釈する必要があります。

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