例如,使用日期和时间控制,用户选择日期和时间,使得字符串表示如下:
"6-25-2012 12:00:00 PM"
这样,这个用户就在EST时区.该字符串传递给服务器,将其转换为.NET DateTime对象,然后将其存储在sql Server的datetime列中.
当日期稍后返回到浏览器时,需要将其转换为日期,但是当上述字符串输入到正在丢失4个小时的日期时.我相信这是因为在创建JavaScript日期时没有指定时区,它默认为当地时间,而且从EST开始,距离GMT为-400,从12点起减去4小时,尽管下午12点是指定为EST,用户在EST时区的机器上选择它.
解决方法
不要依赖JavaScript的Date构造函数来解析字符串.行为和受支持的格式在每个浏览器和区域设置上有很大差异.
Here只是直接使用Date对象的一些默认行为.
如果您必须来自字符串,请尝试使用标准格式,如ISO8601.您以该格式发出的日期为“2012-06-25T12:00:00”.使用JavaScript最简单的方法是使用moment.js.
另外,要注意你实际上代表什么意思.现在,您通过当地的日期/时间,保存本地/日期/时间,并返回本地日期/时间.一路上,什么是“本地”的想法可能会改变.
在许多情况下,日期/时间旨在代表一个确切的时间.要做这项工作,您需要从客户端输入的本地时间转换为UTC.发送UTC到您的服务器,并存储.之后,检索UTC并将其发送回客户端,将其作为UTC处理并转换回本地时间.你可以使用moment.js轻松地完成所有这些工作:
// I'll assume these are the inputs you have. Adjust accordingly. var dateString = "6-25-2012"; var timeString = "12:00:00 PM"; // Construct a moment in the default local time zone,using a specific format. var m = moment(dateString + " " + timeString,"M-D-YYYY h:mm:ss A"); // Get the value in UTC as an ISO8601 formatted string var utc = m.toISOString(); // output: "2012-06-25T19:00:00.000Z"
在.Net中的服务器上:
var dt = DateTime.Parse("2012-06-25T19:00:00.000Z",// from the input variable CultureInfo.InvariantCulture,// recommended for ISO DateTimeStyles.RoundtripKind) // honor the Z for UTC kind
存储在数据库中.稍后检索并发回:
// when you pull it from your database,set it to UTC kind var dt = DateTime.SpecifyKind((DateTime)reader["yourfield"],DateTimeKind.Utc); // send it back in ISO format: var s = dt.ToString("o"); // "o" is the ISO8601 "round-trip" pattern.
将其传回javascript中的javascript.jim:
// construct a moment: var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server // display it in this user's local time zone,in whatever format you want var s = m.format("LLL"); // "June 25 2012 12:00 PM" // or if you need a Date object var dt = m.toDate();
看 – 这很简单,你不需要在时区内看到任何东西.