2

我有一个带有日期列的 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,并且当它被加载到字段中时,日期看起来是正确的。
但是......我担心这意味着它会对不同时区的人显示错误。

我想要的只是一个Date。我什至不想记录时间。在我的应用程序中没有任何意义。

4

2 回答 2

1

当我处理这个问题时,我发现我要么必须克服一个问题,要么必须克服另一个问题。

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

或者

(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.getMonth() +1)' 在那里,因为月份是从 0 开始的。

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

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

于 2013-04-25T23:48:26.987 回答
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) + '"';
};
于 2013-08-16T21:07:17.163 回答