如何将JavaScript日期的时区从浏览器保留到服务器,然后返回?

前端之家收集整理的这篇文章主要介绍了如何将JavaScript日期的时区从浏览器保留到服务器,然后返回?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,使用日期和时间控制,用户选择日期和时间,使得字符串表示如下:
"6-25-2012 12:00:00 PM"

这样,这个用户就在EST时区.该字符串传递给服务器,将其转换为.NET DateTime对象,然后将其存储在sql Server的datetime列中.

当日期稍后返回到浏览器时,需要将其转换为日期,但是当上述字符串输入到正在丢失4个小时的日期时.我相信这是因为在创建JavaScript日期时没有指定时区,它默认为当地时间,而且从EST开始,距离GMT为-400,从12点起减去4小时,尽管下午12点是指定为EST,用户在EST时区的机器上选择它.

很明显,在传递给服务器以保持原始datetime字符串之前,需要添加一些东西.推荐的方法是什么?

解决方法

不要依赖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();

看 – 这很简单,你不需要在时区内看到任何东西.

猜你在找的JavaScript相关文章