【问题标题】:Parse date in JavaScript that is sent by ASP.Net via a cookie解析 ASP.Net 通过 cookie 发送的 JavaScript 日期
【发布时间】: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);
    }

【问题讨论】:

标签: javascript c# asp.net date datetime


【解决方案1】:

尽管 cmets 已经为您指明了正确的方向:

如果您使用 moment.js,它将默认使用 UTC 格式,即使不是(为了完整起见),您也可以使用此格式指定偏移量:2013-02-08 09:30:26.123+07:00

你这样调用代码:moment(cDate, $format);

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您希望将 cookie 中传递的日期从 UTC 转换为本地时间。

    您可以使用Date.prototype.getTimezoneOffset()

    getTimezoneOffset 以分钟为单位返回从 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();
    <div id="serverUTCTime"></div>
    <br/>
    <div id="localTime"></div>

    【讨论】:

    • 客户端如何知道从 ASP.Net 收到的日期格式是 mm/dd/yyyy 格式。它也可能是 dd/mm/yyyy 格式。例如,如果 ASP.Net 发送10/11/2015 7:29:54 PM,JavaScript 如何知道第一部分是月还是日。我认为这是将日期字符串传递给日期对象new Date ('10/31/2015 7:29:54 PM') 的问题。我认为如果将单个组件传递给 JavaScript Date 对象而不是从 ASP.Net 接收的日期时间值会更好。
    • 另外,不确定使用这种方法是否会考虑日间节省时间。我在另一个 stackoverflow 帖子中遇到了这个问题:“getTimezoneOffset 返回您调用它的日期和时间的偏移量。当时区进入或退出夏令时时,该偏移量可能会发生变化。”
    • 查看夏令时调整的编辑,至于格式,两边强制相同...
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2017-09-26
    相关资源
    最近更新 更多