Разница DateTime между сервером и клиентом - PullRequest
0 голосов
/ 03 мая 2011

все! Я решаю следующую проблему со временем в моем проекте ASP.NET MVC:

Проблема: необходимо рассчитать разницу между клиентом DateTime и сервером DateTime. У меня есть функция JavaScript, которая делает Ajax-запрос к серверу (DateController) с параметром timeStamp = getNow (), код которого приведен ниже.

   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 ]

1 голос
/ 03 мая 2011

Вы, похоже, боретесь с преобразованием даты javascript в дату C #.

[Update] getUTCMilliseconds () возвращает только миллисекундную часть даты [/ Update]
Чтобы передать дату в миллисекундах на сервер, используйте эту функцию:

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 голосов
/ 03 мая 2011

Может быть DateTime.Now больше DateTime.UtcNow и (DateTime.UtcNow - DateTime.Now).TotalMilliseconds возвращает 0

0 голосов
/ 03 мая 2011

Переход на летнее время препятствует тому, чтобы функция getTimezoneOffset () возвращалась на постоянное значение даже для данной локали.

...