Javascript 从JsonStore保存记录时,如何让ExtJS包含时区(采用ISO 8601格式)?

Javascript 从JsonStore保存记录时,如何让ExtJS包含时区(采用ISO 8601格式)?,javascript,datetime,extjs,timezone,Javascript,Datetime,Extjs,Timezone,在下面的代码段中,我创建了一个JsonStore(其记录类型为单个日期字段),向其中添加一条新记录,然后保存它。保存时,时区不包含在序列化日期值中,即使它包含在实际记录对象中(如Firebug所示)。Ext似乎将日期转换为浏览器的时区,但在向服务器发送请求时,会删除时区。我使用的是ISO 8601日期时间格式('c'),如果我正确阅读了Ext文档,则应该包含时区 即使它正在转换为浏览器的时区,这对我来说也不是问题,只要它在保存记录时包含该时区。目前,服务器的编写方式必须确保它能够解析浏览器时区中

在下面的代码段中,我创建了一个JsonStore(其记录类型为单个日期字段),向其中添加一条新记录,然后保存它。保存时,时区不包含在序列化日期值中,即使它包含在实际记录对象中(如Firebug所示)。Ext似乎将日期转换为浏览器的时区,但在向服务器发送请求时,会删除时区。我使用的是ISO 8601日期时间格式(
'c'
),如果我正确阅读了Ext文档,则应该包含时区

即使它正在转换为浏览器的时区,这对我来说也不是问题,只要它在保存记录时包含该时区。目前,服务器的编写方式必须确保它能够解析浏览器时区中的传入日期,但将它们发送到可能位于不同时区的客户端,这看起来很麻烦。有什么建议吗?我在Ext论坛上阅读了几个看似相关的问题,但它们似乎处理的问题略有不同

var myDataStore = new Ext.data.JsonStore({
    url: '/api/echo',    
    writer: new Ext.data.JsonWriter({
        encode: false,
        writeAllFields: true
    }),
    root: 'records',
    fields: [
        {name: 'myDate', type: 'date', dateFormat: 'c'}
    ],
    autoSave: false,
    autoLoad: false
});

myDataStore.add(new myDataStore.recordType({myDate: Date.parseDate('2010-11-08T11:00:00.000-0000','c')}));
myDataStore.save();
序列化数据(无时区):


没关系,谷歌的神奇短语显然是“extjs时区序列化”。这似乎是一个问题。解决方案似乎相当简单:

Ext.util.JSON.encodeDate = function(o)
{
   return '"' + o.format('c') + '"';
}

正在更新Ext JS 4的答案:

Ext.JSON.encodeDate = function(o)
{
   return '"' + Ext.Date.format(o, 'c') + '"';
};

是啊,看起来真像只虫子。就我个人而言,我总是以原始POSIX(UTC)整数时间戳格式传递时间,试图避免浏览器、服务器和数据库之间的许多特定于区域设置的时间陷阱。是的,这似乎是理想的方法。不幸的是,要将客户端日期时间转换为UTC需要一点ExtJS黑客(只比上面多一点);看,这太奇怪了。你不应该做这些。标准JavaScript
Date
的方法
getTime()
将给您一个UTC时间戳(
/1000
以POSIX形式获取)。
Ext.JSON.encodeDate = function(o)
{
   return '"' + Ext.Date.format(o, 'c') + '"';
};