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 )。与えられた答えが正しいかどうかわからない。必要ではないメタデータをハッキングしているように見えますか?
私はまだこの問題の解決策を探しています
バインディングとフィルターの使用の場合、データの異なる処理を検出しました。
私はよく知らないので、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仕様から削除されたことを認識してください。多くの人(私を含む)はこれを間違いだと考えています。これがあなたに影響を与えるかどうかはわかりませんが、注意する必要があります。
お役に立てば幸いです。
タイプsap.ui.model.type.Date({ oFormatOptions:{ style: "short", UTC: true} })
を使用します。これにより、サーバーから送信された日付が保持されます。
日付パスを値ではなくdateValueにバインドしてみてください。 Edm:DateTimeを自動的に解釈する必要があります。
new sap.m.DatePicker({
dateValue : "{BirthDate}"
})