服务器和客户端之间的DateTime差异

时间:2011-05-03 09:37:10

标签: javascript asp.net-mvc datetime timezone utc

大家好! 我正在ASP.NET MVC项目中解决下一个问题:

问题:需要计算客户端DateTime和服务器DateTime之间的差异。 我有javascript函数,用timeStamp参数= getNow()对服务器(DateController)进行Ajax查询,其代码如下。

   getNow: function() {
        var date = new Date();
        return (date.getTime() + (date.getTimezoneOffset() * 60000));
    }

接下来,在服务器端,我有DateController,我需要以毫秒为单位计算dateTime差异:

     ....
     var clientMs = long.Parse(Request.QueryString["t"]);
     var dt1970 = new DateTime(1970, 1, 1, 0, 0, 0);
     var msFrom1970 = (DateTime.Now - dt1970).TotalMilliseconds
            +(DateTime.UtcNow - DateTime.Now).TotalMilliseconds;
     var timeOffset = msFrom1970 -clientMs; 

     return new JsonResult
        {
            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
            Data = new { responseText = timeOffset.ToString() 
        };
     }

但是timeOffset计算错误。我尝试在小型控制台应用程序中检查此逻辑:

 class Program
{
    static void Main(string[] args)
    {
         var clientMs =  1304411645875; 
        //value  of clientMs I get from javaScript by using page
        //http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_gettime
        //with this script
         /*
         <HTML>
         <body>
           <script type="text/javascript">
           var d=new Date();
            document.write(d.getTime());
           </script>
          </body>
         </HTML>
         */



        var dt1970 = new DateTime(1970, 1, 1, 0, 0, 0);
        var msFrom1970 = (DateTime.Now - dt1970).TotalMilliseconds
            +(DateTime.UtcNow - DateTime.Now).TotalMilliseconds;
        Console.WriteLine( msFrom1970);
        Console.ReadLine();
    }
}

差异大约是几个小时。 有人能告诉我我的错误或问题是由其他事情发生的吗?

3 个答案:

答案 0 :(得分:1)

您似乎在努力将javascript日期转换为C#日期。

[更新] getUTCMilliseconds()仅返回日期[/ Update]的毫秒部分 要将日期(以毫秒为单位)传递给服务器,请使用此功能:

getNow: function() {
    var date = new Date();
    return date.getUTCMilliseconds();
}

<击> 并将此UTC毫秒的值转换为.NET中的DateTime:

// Convert UTC milliseconds to System.DateTime
DateTime dtClient = new DateTime((millisecondsClient * TimeSpan.TicksPerMillisecond) + 621355968000000000);

// Test if this conversion is correct:
TimeSpan offset = DateTime.UtcNow - dtClient;

您似乎缺少的是从毫秒到刻度的转换。

参考文献:
    http://www.w3schools.com/jsref/jsref_getUTCMilliseconds.asp
    http://twit88.com/blog/2011/01/23/net-datetime-from-milliseconds/

答案 1 :(得分:0)

夏令时阻止函数的getTimezoneOffset()返回,即使对于给定的语言环境也是常量。

答案 2 :(得分:0)

可能DateTime.Now大于DateTime.UtcNow(DateTime.UtcNow - DateTime.Now).TotalMilliseconds返回0