ExtJS日期字段不保留有关提交的时区信息

时间:2016-07-22 05:27:52

标签: datetime extjs timezone json.net

表单视图上有3个日期字段。服务器端的代码如下所示:

DateTime dtUTC = new DateTime(2010,8,8,2,4,6).SetKind(DateTimeKind.Utc);
DateTime dtLocal = new DateTime(2010,8,8,2,4,6).SetKind(DateTimeKind.Local);
DateTime dtUnspec = new DateTime(2010,8,8,2,4,6).SetKind(DateTimeKind.Unspecified);

一个是UTC,一个是Local,一个是Unspecified。我正在使用JSON.NET来序列化ISO 8601格式的日期。它们被正确地序列化到客户端,看起来如下:

"UtcDate": "2010-08-08T02:04:06.0000000Z",
"LocalDate": "2010-08-08T02:04:06.0000000+05:30",
"TokyoDate": "2010-08-08T02:04:06.0000000"

现在我有3个ExtJs(版本6.0.1.250)日期字段(我已将'displayFormat'设置为“yyyy' - 'MM' - 'dd HH':​​'mm':'ss”以显示时间)以浏览器特定的时区格式显示它们,这很好。

UTC日期:2010-08-08 02:04:06
当地日期:2010-08-08 07:34:06
未指定日期:2010-08-08 02:04:06

我的模型字段定义如下

{
    name: "UtcDate",
    type: "date",
    allowNull: true,
    dateFormat: "c"
},
{
    name: "LocalDate",
    type: "date",
    allowNull: true,
    dateFormat: "c"
},
{
    name: "UnspecDate",
    type: "date",
    allowNull: true,
    dateFormat: "c"
}

问题是当我向服务器提交日期时,我以当地时区格式获取所有日期

"UtcDate":"2010-08-08T07:34:06+05:30",
"LocalDate":"2010-08-08T02:04:06+05:30",
"UnspecDate":"2010-08-08T02:04:06+05:30"

有没有办法,我可以将它们恢复为与发送给客户端的服务器相同的时区格式?为什么日期字段在提交时不保留原始记录时区信息?

2 个答案:

答案 0 :(得分:1)

日期字符串在解析为javascript Date对象时,不保留原始时区信息,因为javascript Date对象没有时区信息,因此转换为标准javascript日期不能无损。

另外,基本上,.NET提供的三个“时区”(DateTimeKind)是一个笑话 - 现在大约有100个不同的时区在使用,如果你考虑历史记录,甚至更多。当你将TokyoDate与你的UTCDate进行比较时,你可以看到它们是一个笑话 - 它们是相同的,但它们不应该。未指定的时区对任何人都没有帮助,因为您可以从中推断出特定的时间点。

如果您需要使用javascript中的日期保留完整时区信息,则必须使用支持时区的库(如MomentJS)以及支持具有日期对象的所有时区的服务器端语言同样,或者你必须完全自己构建一些东西。

不幸的是,目前MomentJS和ExtJS之间没有互通,所以这也意味着你必须自己构建一些东西,比较How could we set globally in Sencha ExtJS version 6.0.2 the timezone that we want to use?How to show Moment JS formatted date in ExtJS field with xtype: 'datefield'Convert string to new Date object in UTC timeZONE。< / p>

答案 1 :(得分:0)

要以更好的方式处理它,请使用适当的时区转换从服务器端以字符串格式返回日期。在模型的convert()函数中,获取字符串并返回日期值。这将解决您的时区问题。

示例:

convert(v){
//Here v is the input string coming from server side.
var date = new Date(v);
return date;
} 

希望这有帮助!!!