【问题标题】:DateTime difference between server and client服务器和客户端的日期时间差
【发布时间】:2011-05-03 09:37:10
【问题描述】:

大家! 我正在解决我的 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();
    }
}

相差大约几个小时。 谁能告诉我我的错误或问题是由其他原因引起的吗?

【问题讨论】:

  • 是的。抱歉拼写错误,我更正了。

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


【解决方案1】:

您似乎很难将 javascript 日期转换为 C# 日期。

[Update] 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/

【讨论】:

  • 也许我没有准确解释我的问题。
  • 但我需要计算服务器和客户端日期时间之间的总差异,以毫秒为单位。例如:3 may 2011 14:12:10 - 4 may 2011 02:00:10 = -11:48:00 = -42480000 milliseconds
  • 偏移时间跨度包含那个差异吗?只需执行offset.TotalMilliseconds()。变量 'millisecondsClient' 是您的 clientMs 变量。您认为缺少什么?
  • 我的意思是函数 getNow,因为方法 getUTCMilliseconds 返回日期时间对象的 only 毫秒分量。见w3schools.com/jsref/jsref_getutcmilliseconds.asp
  • 哦,好吧,我的错 :-) 我已经更新了我的答案以反映您的评论。
【解决方案2】:

夏令时可防止函数的 getTimezoneOffset() 返回值成为常数,即使对于给定的语言环境也是如此。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • DateTime.UtcNow - DateTime.Now 可以小于 0。
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2013-03-24
    • 2016-05-12
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多