2011-05-03 167 views
0

everyone! 我在ASP.NET MVC项目中解决了下一个问题:服务器和客户端之间的日期时间差异

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

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

接下来,在服务器端我有DateController,在我需要计算在毫秒日期时间差异:

 .... 
    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(); 
    } 
} 

差异是大约小时。 有人可以告诉我我的错误或问题是由别的东西发生的吗?

+0

你的意思是 “差异化”? – jackJoe 2011-05-03 09:45:34

+0

是的。对不起拼写,我纠正了它。 – Roman 2011-05-03 09:52:18

回答

1

更大的你似乎有一个JavaScript日期转换为C#日期挣扎。

[更新] getUTCMilliseconds()只返回日期的毫秒部分[/更新]
为了通过以毫秒为单位的时间给服务器,使用此功能:

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

并以UTC毫秒这个值转换为DateTime在.NET:

// 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/

+0

也许我没有准确地解释我的问题。 – Roman 2011-05-03 10:59:20

+0

但我需要计算**服务器和客户端日期时间之间的总差异**,以毫秒为单位。 例如:'3月20​​11年14:12:10 - 4月2011年02:00:10 = -11:48:00 = -42480000毫秒' – Roman 2011-05-03 11:06:25

+0

谢谢,它帮助我! – Roman 2011-05-03 11:36:01

0

夏时制时间可以防止函数的getTimezoneOffset()从一个常量返回,即使对于给定的语言环境。

0

也许DateTime.NowDateTime.UtcNow(DateTime.UtcNow - DateTime.Now).TotalMilliseconds返回0

+0

DateTime.UtcNow - DateTime.Now可以小于0. – Roman 2011-05-03 10:22:30

相关问题