如何将OData服务中的日期/时间正确添加到UI? 上下文

如何将OData服务中的日期/时间正确添加到UI? 上下文,odata,sapui5,Odata,Sapui5,我正在创建一个小的演示页面,显示UI5的一些直接功能。本页面由两个主要页面组成: 在第一页上,有一个可以创建、删除和更新的运营商列表。这些运营商有一个ID(Carrid) 如果单击一家航空公司,它们将被发送到第二个页面,在该页面上,所选航空公司的所有航班都显示在一个表格中(带有一些航班信息) 该表如下所示: <Table id="detailTable" inset="false" class="sapUiResponsiveMargin"> <columns>

我正在创建一个小的演示页面,显示UI5的一些直接功能。本页面由两个主要页面组成:

  • 在第一页上,有一个可以创建、删除和更新的运营商列表。这些运营商有一个ID(
    Carrid
  • 如果单击一家航空公司,它们将被发送到第二个页面,在该页面上,所选航空公司的所有航班都显示在一个表格中(带有一些航班信息)
该表如下所示:

<Table id="detailTable" inset="false" class="sapUiResponsiveMargin">
    <columns>
        <Column>
            <Text text="ID" />
        </Column>
        <Column>
            <Text text="Flightnumber" />
        </Column>
        <Column>
            <Text text="Starts in" />
        </Column>
        <Column>
            <Text text="Departs at" />   
        </Column> 
        <Column>
            <Text text="Lands in" />   
        </Column> 
        <Column>
            <Text text="Lands at" />   
        </Column>
    </columns>
</Table>
问题 如果数据可以在不进行任何操作的情况下显示,那么代码就可以正常工作。但是字段
{Deptime}
{Arrtime}
具有我需要首先转换的类型,以便以人类可读的形式显示它。
我能够通过这段代码实现这一点(我知道,这不是最有效的方法,但我仍在学习。因此,如果您有任何改进,请随时发布):

pageTable.addEventDelegate({
onAfterRendering:函数(){
var mTable=this.getView(“filterbersimple”).byId(“detailTable”);
var mModel=mTable.getModel();
var aItems=mTable.getItems();
//----时间转换----
var arrayTime=[];
对于(变量iTime=0;iTime
这将生成正确的输出:

但我无法再次将这些被操纵的数据正确绑定到表中。我用
OData.read()
函数和其他一些相当粗糙的方法尝试过它,但我从未成功过,而且我一直在解决这个问题

如果有人有任何想法或建议,如果您能告诉我,我将不胜感激。

如果您只是想以人类可读的形式显示时间(或日期),则无需使用“黑客方法”或自定义格式化程序。UI5附带概念数据类型,具有以下优点:

  • 让UI5格式化解析,甚至为您验证该值
  • 与格式化程序相比,支持双向数据绑定
  • 可以定义其他格式选项或输入约束
在我们的例子中,显示Edm.Time值的合适的
类型是
sap.ui.model.odata.type.Time

样品 发件人:


注意:关于
核心:require
-语法,请参阅从UI51.69开始支持的语法。对于较低版本,请使用以下语法:

type:'sap.ui.model.odata.type.(日期)时间'
结果

有关更多信息,包括如何在
DateRangeSelection
中绑定DateTime或DateTimeOffset,请参阅文档主题


TL;博士
  • 检查实体属性在服务
    $metadata
    文档中使用的类型

  • 在属性绑定中使用OData类型之一:

    xmlns:core=“sap.ui.core”
    core:require=“{RequiredODataType:'sap/ui/model/odata/type/


  • 我使用的是sap.ui.model.odata.type.Time,但问题是使用默认格式会使此值P00DT00H00M00S而不是此PT0H0M0S,odata服务会出现奇怪的错误:
    无法读取null的属性“1”
    @zygimantus是odata服务版本
    “2.0“
    ?还请确保实体属性在元数据文档中具有
    Type=“Edm.Time”
    ,以便使用
    sap.ui.model.odata.Type.Time
    // Get routing data and show only entrys with the matched primary key (Carrid)
    _onRouteMatched: function(oEvent) {
        // ...
        var oArgs = oEvent.getParameter("arguments");
        var oFlightTable = oView.byId("detailTable");
        oFlightTable.bindAggregation("items", {
            path: "/CarrierSet(" + "'" + oArgs.flightPath + "'" + ")/FlightSet",
            template: new sap.m.ColumnListItem({
                cells: [
                    new sap.m.Text({
                        text: "{Carrid}"
                    }),
                    new sap.m.Text({
                        text: "{Connid}"
                    }),
                    new sap.m.Text({
                        text: "{Cityfrom}"
                    }),
                    new sap.m.Text({
                        text: "{Deptime}"
                    }),
                    new sap.m.Text({
                        text: "{Cityto}"
                    }),
                    new sap.m.Text({
                        text: "{Arrtime}"
                    })
                ]
            })
        });
    }
    
    pageTable.addEventDelegate({
        onAfterRendering: function() {
            var mTable = this.getView("FilterBarSimple").byId("detailTable");
            var mModel = mTable.getModel();
            var aItems = mTable.getItems();
    
            // ----- TIME CONVERSION ----
    
            var arrayTime = [];
            for (var iTime = 0; iTime < aItems.length; iTime++) {
                var iAdded = mModel.getProperty("Deptime", aItems[iTime].getBindingContext());
                arrayTime.push(iAdded);
            }
            var timeFormat = sap.ui.core.format.DateFormat.getTimeInstance({
                pattern: "kk:mm:ss"
            });
            var tz = new Date(0).getTimezoneOffset() * 60 * 1000;
            var arrayTimeClean = [];
            $.each(arrayTime, function(ii, ee) {
                var timeStr = timeFormat.format(new Date(ee.ms + tz));
                arrayTimeClean.push(timeStr);
            });
        }
    });