ASP.Net通过cookie

时间:2015-11-01 18:32:33

标签: javascript c# asp.net date datetime

我使用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工作,因此节省光量不会导致编程逻辑出现问题。

  • 使用日期时间的各个组件,通过cookie将ASP.Net服务器端的UTC而不是本地日期时间传递给客户端。不要将日期时间字符串,而是将日期时间的各个组件作为逗号分隔的列表传递,格式如下:year,month, day, hours, min, sec, milliseconds。从ASP.Net传递单个组件而不是日期时间字符串是更好的,因为JavaScript Date构造函数在解析字符串时可能会以不稳定的方式运行,特别是如果传递的字符串格式不是构造函数所喜欢的。传递单个组件也有助于跨浏览器的一致行为,因为具有单个组件的Date构造函数适用于所有主流浏览器。
  • 在客户端,读取cookie值并实例化一个Date对象,该对象将是浏览器端对应于服务器端UTC时间的本地时间
  • 现在,您在服务器端ASP.Net在客户端以本地日期时间传递了日期时间。这可能适用于某些情况,但在夏令时发生时可能会在客户端出现突然的意外,因此最好将此客户端日期转换为UTC。

从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);
    }

2 个答案:

答案 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;
&#13;
&#13;