extjs datecolumn显示关闭一天的日期

时间:2013-04-25 21:14:51

标签: javascript date grid extjs4.1 utc

我有一个带日期列的Ext.grid。一切正常,但日期是休息一天。

我发现当我将数据添加到网格的商店时,值为2013-03-31。之后,当我查看商店的数据时,值为Sat Mar 30 2013 17:00:00 GMT-0700 (US Mountain Standard Time)

显然,这是一个时区问题,但我不知道如何解决它。

以下是我将数据添加到网格商店的代码

for (var i = 0; i < dateboxes.length; i++) 
{
    dateboxGrid.store.add(dateboxes[i]);
    //dateboxes[i].Value contains the date in this form: "2013-03-31"
}
console.log(dateboxGrid.getStore()) //logs "Sat Mar 30 2013 17:00:00 GMT-0700 (US Mountain Standard Time)"

在将dateboxes[i].Value添加到商店之前,我需要做什么才能确保预期日期显示在列中?

更新
我做了以下改变。当我将日期保存到数据库时,我首先在数据上调用.toISOString()。现在,当数据从数据库加载到存储中时,它将被加载为GMT +0700,并且日期在加载到字段中时看起来正确。
但是......我担心这意味着它会在不同的时区出现错误。

我想要的只是日期。我甚至不想记录时间。在我的申请中没有任何意义。

2 个答案:

答案 0 :(得分:1)

当我使用它时,我发现我要么克服一个问题,要么克服另一个问题。

(1)如果我使用datecolumn编辑器datefield,并且商店模型中的字段为type: 'date',则值将作为日期存储在数据库中(包括时间)。当我尝试检索日期时,Timezone会启动并更改已加载的日期。

(2)如果我没有使用datecolumn并将商店的模型设置为type: 'date',则日期不会显示在单元格中。即使它们存储为简单的字符串,它们也不会在网格中正确显示。

以下是我的意见: 我使用了选项(1),但在将商店的数据发送到数据库之前,我这样做了:

    for (var i = 0; i < dateboxes.length; i++) {
        if (dateboxes[i].Value != null) {
            var date = new Date(dateboxes[i].Value);
            dateboxes[i].Value = String(date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate());
        }
    }

这基本上只是将Date更改为String。现在,数据作为简单字符串存储在数据库中。当它显示在网格中时,没有时区信息可以搞乱它。代码`(date.getMonth()+1)'就在那里,因为month是0。

当我回顾答案时,有些事情没有意义。我一定也改变了别的东西。无论哪种方式......它现在都有效。

我会把这个问题留给其他人,以便更好地解释发生了什么。

答案 1 :(得分:0)

我不认为这与时间戳有关。查看encodeDate的源代码......看起来ExtJS会增加月份,但不是一天。我猜这是他们尝试修复的。我通过在我的javascript中覆盖encodeDate来解决它:

var fFbegin_settle_date = new Date();

Ext.util.JSON.encodeDate = function(fFbegin_settle_date) {
     //didn't work: return fFdateBegin.format('"Y-m-d"');
    pad = function(n) {
        return n < 10 ? "0" + n : n;
    }
    return '"' + fFdateBegin.getFullYear() + "-" +
    pad(fFdateBegin.getMonth()+1) + "-" +
    pad(fFdateBegin.getDate()+1) + '"';
};