【发布时间】:2015-11-01 18:32:33
【问题描述】:
我使用 ASP.Net 服务器端 C# 代码将日期时间值存储在 cookie 中。 在客户端,我正在读取日期并使用 JavaScript 将其转换为 UTC。代码如下。
在 ASP.Net 中存储日期时间
//DateTime.Now depends on location of web server
HttpCookie cookie = new HttpCookie("xyz", DateTime.Now.ToUniversalTime().ToString());
Response.Cookies.Add(cookie);
用于读取 ASP.Net 发送的日期时间的 JavaScript 代码
//cDate depends on user's location
//c is value read from cookie named 'xyz'
var cDate = new Date(c);
var cDate_utc = new Date(cDate.getUTCFullYear(), cDate.getUTCMonth(), cDate.getUTCDate(), cDate.getUTCHours(), cDate.getUTCMinutes(), cDate.getUTCSeconds());
当最终用户的位置与 ASP.Net Web 服务器的位置不同时,JavaScript 将错误地解释 cookie 中的日期时间值。例如,在一种情况下,cookie 中存储的值是 10/31/2015 7:29:54 PM,JavaScript 无法知道这是 UTC,这意味着它会在客户端被错误地解析。
问题:如何在上述场景中将 DateTime 值从 ASP.Net 传递给 JavaScript,以便无论最终用户的浏览器和 ASP.Net Web 服务器的地理位置如何,它都能在 JavaScript 中正确解释?
使用有效的解决方案进行更新
经过大量研究,我想出了以下内容。底线是始终在 UTC 中工作,因此夏令时不会导致编程逻辑出现问题。
- 使用日期时间的各个组件通过 cookie 将 UTC 而不是本地日期时间从 ASP.Net 服务器端传递到客户端。不要传递日期时间字符串,而是将日期时间的各个组成部分作为逗号分隔的列表传递,格式如下:
year,month, day, hours, min, sec, milliseconds。从 ASP.Net 传递单个组件而不是日期时间字符串会更好,因为 JavaScript Date 构造函数在解析字符串时可能会以不稳定的方式表现,特别是如果传递的字符串格式不是构造函数喜欢的格式。传递单个组件还有助于实现跨浏览器的一致行为,因为具有单个组件的 Date 构造函数在所有主流浏览器中都能很好地工作。 - 在客户端,读取 cookie 值并实例化一个 Date 对象,该对象将是与服务器端 UTC 时间相对应的浏览器端本地时间
- 现在,服务器端 ASP.Net 在客户端以本地日期时间传递日期时间。这可能适用于某些情况,但在夏令时发生时可能会导致客户端突然出现意外,因此最好将此客户端日期转换为 UTC。
将 UTC 日期时间从 ASP.Net 传递到客户端
DateTime utcDateTime = DateTime.Noe.ToUniversalTime();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(utcDateTime.Year);
sb.Append(",");
sb.Append(utcDateTime.Month - 1); //since JavaScript uses a 0 based index for month
sb.Append(",");
sb.Append(utcDateTime.Day);
sb.Append(",");
sb.Append(utcDateTime.Hour);
sb.Append(",");
sb.Append(utcDateTime.Minute);
sb.Append(",");
sb.Append(utcDateTime.Second);
sb.Append(",");
sb.Append(utcDateTime.Millisecond);
HttpCookie cookie = new HttpCookie("xyz", sb.ToString());
Response.Cookies.Add(cookie);
在 JavaScript 中获取传递的 ASP.Net 日期时间的 UTC 日期时间
var c = getCookie("xyz");//getCookie is a custom JavaScript function to read cookie value
if (c) {
var dateArray = c.split(",");
//get local date time corresponding to ASP.Net passed UTC date time
var cDate = new Date( Date.UTC(dateArray[0], dateArray[1],dateArray[2], dateArray[3], dateArray[4], dateArray[5], dateArray[6])) ;
//get UTC date time so day light savings does not cause issues in logic on client-side
cDate_utc = new Date(cDate.getUTCFullYear(), cDate.getUTCMonth(), cDate.getUTCDate(), cDate.getUTCHours(), cDate.getUTCMinutes(), cDate.getUTCSeconds());
logInfo("date from cookie in utc is " + cDate_utc);
}
【问题讨论】:
-
看看moment.js。 momentjs.com/docs
-
@dbugger,图书馆怎么知道
10/31/2015 7:29:54 PM是UTC?在我的场景中,像10/31/2015 7:29:54 PM这样的 UTC 值被存储在 cookie 中。 -
这篇文章可能会有所帮助:stackoverflow.com/questions/2532729/…
标签: javascript c# asp.net date datetime