我有一个带日期列的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
,并且日期在加载到字段中时看起来正确。
但是......我担心这意味着它会在不同的时区出现错误。
我想要的只是日期。我甚至不想记录时间。在我的申请中没有任何意义。
答案 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) + '"';
};