DateTime теряет точность при сериализации / десериализации - PullRequest
1 голос
/ 10 сентября 2010

Я устанавливаю дату в поле типа DateTime и вызываю свой веб-сервис, который расположен на том же сервере, используя WCF:

// on the client        
myObject.Date = DateTime.Now;
myChangedObject = proxy.DoNothing(myObject);  // passes back the object

// on the server
public MyObjectType DoNothing(MyObjectType source)
{
    var obj = new MyObjectType();
    obj.Date = source.Date;

    return obj;
}

Когда он попадает на сервер, DateTime точно указанк тикам, но объект, который я получаю обратно, имеет разное количество тиков.

    Assert.IsTrue(myChangedObject.Date == myObject.Date);  // fails miserably

Что я здесь не так делаю?Я проверил, что значения хранятся в

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Хранение DateTime в типе SQL Server Datetime приведет к потере точности, поскольку SQL Server сохраняет время только с шагом 1/300 с. Я бы использовал функцию, которая усекает до секунд перед сравнением, например:

bool AreDateTimesEqual(DateTime a, DateTime b)
{
    return a.AddMilliseconds(-a.Millisecond)
        == b.AddMilliseconds(-b.Millisecond);
}

Или, если у вас есть контроль над схемой и SQL Server 2008, переключитесь на Datetime2, который имеет полную точность DateTime.

1 голос
/ 11 сентября 2010

Может быть, вам лучше попробовать DateTime.UtcNow?

Я не могу говорить о реализации MS, но у меня была проблема с DataSet, передаваемым через WCF - во всех столбцах DateTime было установлено значение DateTimeKind UnspecifiedLocal и веб-служба(Я полагаю) пытался быть мудрым, поэтому он конвертировал время в UTC ... Он также пытался обратить процесс (все еще оставаясь на DateTimeKind.UnspecifiedLocal) на стороне клиента, но клиент находился в другой TimeZone, поэтому он потерпел неудачужалко.

Итак, чтобы подвести итог, они, возможно, преобразовали его в UTC ... Таким образом, лучший способ на самом деле - передать все в UTC, а затем при необходимости преобразовать в местное время.Это также лучшая практика для сохранения даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...