我在表单视图中有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':'m':'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"
有没有一种方法,我可以把它们以服务器发送到客户端的相同时区格式返回?为什么提交时日期字段不保留原始记录时区信息?
日期字符串在解析为javascript日期对象时,不会保留原始时区信息,因为javascript日期对象没有时区信息,因此转换为标准javascript日期不可能是无损的。
此外,基本上还有三个"时区"(DateTimeKind)。NET提供的是一个笑话——现在有大约100个不同的时区在使用,如果你考虑到历史,甚至更多。当你将你的TokyoDate与你的UTCDate进行比较时,你会发现它们是一个笑话——它们是一样的,但不应该。一个未指定的时区对任何人都没有帮助,因为你可以从中推断出一个特定的时间点。
如果你需要用javascript中的Date保留完整的时区信息,你必须使用一个支持时区的库,比如MomentJS,以及一个支持所有时区的服务器端语言和Date对象,或者你必须完全自己构建一些东西。
不幸的是,MomentJS和ExtJS目前还没有互通,所以这也意味着你必须自己构建一些东西,比较一下我们如何在Sencha ExtJS 6.0.2版本中全局设置我们想要使用的时区?,如何在ExtJS字段中显示Moment JS格式的日期,xtype:';日期字段';,将字符串转换为UTC时区中的新日期对象。
为了更好地处理它,请从服务器端以字符串格式返回日期,并进行适当的时区转换。在模型的convert()函数中,获取字符串并返回日期值。这将解决您的时区问题。
示例:
convert(v){
//Here v is the input string coming from server side.
var date = new Date(v);
return date;
}
希望这能有所帮助!!!