我使用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中的日期时间值将被JavaScript错误地解释。例如,在一种情况下,存储在cookie中的值为10/31/2015 7:29:54 PM
,并且JavaScript无法知道这是UTC,这意味着它将在客户端被错误地解析。
问题:如何在上面的场景中将ASP.Net的DateTime值传递给JavaScript,这样无论最终用户的浏览器和ASP.Net Web服务器的地理位置是什么,它都能在JavaScript中正确解释?
使用可行的解决方案进行更新
经过大量研究,我想出了以下内容。最重要的是始终以UTC工作,因此节省光量不会导致编程逻辑出现问题。
year,month, day, hours, min, sec, milliseconds
。从ASP.Net传递单个组件而不是日期时间字符串是更好的,因为JavaScript Date构造函数在解析字符串时可能会以不稳定的方式运行,特别是如果传递的字符串格式不是构造函数所喜欢的。传递单个组件也有助于跨浏览器的一致行为,因为具有单个组件的Date构造函数适用于所有主流浏览器。从ASP.Net
将UTC日期时间传递给客户端 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);
获取传递ASP.Net日期时间的JavaScript日期时间
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);
}
答案 0 :(得分:2)
虽然评论已经指出了正确的方向:
如果您使用moment.js,它将默认使用UTC格式,即使它不是(为了完整起见),您也可以使用此格式指定偏移量:2013-02-08 09:30:26.123+07:00
您可以调用以下代码:moment(cDate, $format);
答案 1 :(得分:1)
如果我正确理解您的问题,您希望将Cookie中传递的日期从UTC转换为本地时间。
您可以使用Date.prototype.getTimezoneOffset()
getTimezoneOffset
以UTC为单位返回从UTC到本地时间的偏移量。
通过减去偏移分钟来本地调整...
new Date(dateServer.getTime() - ((60 * 1000) * dateServer.getTimezoneOffset()))
这是一个例子......
var dateJan;
var dateJul;
var dateValue;
var divLocal;
var divServer;
var timezoneOffset;
dateValue = new Date('10/31/2015 7:29:54 PM')
divServer = document.getElementById('serverUTCTime');
divLocal = document.getElementById('localTime')
divServer.innerHTML = 'from server = ' + dateValue.toString();
// Get dates for Jan & Jul
dateJan = new Date(dateValue.getFullYear(), 0, 1);
dateJul = new Date(dateValue.getFullYear(), 6, 1);
// Get timezone offset
timezoneOffset = Math.max(dateJan.getTimezoneOffset(), dateJul.getTimezoneOffset());
// Check if daylight savings
if (dateValue.getTimezoneOffset() < timezoneOffset) {
// Adjust date by Jan offset
dateValue = new Date(dateValue.getTime() - ((60 * 1000) * dateJan.getTimezoneOffset()));
} else {
// Adjust date by Jul offset
dateValue = new Date(dateValue.getTime() - ((60 * 1000) * dateJul.getTimezoneOffset()));
}
divLocal.innerHTML = 'to local = ' + dateValue.toString();
&#13;
<div id="serverUTCTime"></div>
<br/>
<div id="localTime"></div>
&#13;