如何将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();

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...