2013-08-31 152 views
3

考虑以下代码:更新日期时间

var datetime = DateTime.Now;   
var instantMessage = InstantMassageingManager.GetConverationMessages().FirstOrDefault(); 
InstantMassageingManager.UpdateConversationMessageReadDateTime(instantMessage.InstantMessageInstanceId, datetime); 
var message = InstantMassageingManager.GetMessageById(instantMessage.InstantMessageInstanceId); 
Assert.IsTrue(message.ReadDateTime.Value == datetime); 

在第一线,我得到DateTime.Now

enter image description here

然后我更新数据库中的记录:UpdateConversationMessageReadDateTime

,并获得来自数据库的消息:

enter image description here

message.ReadDateTimedatetime都具有相同的值,但具有不同的Tick。

所以我的测试没有通过。

为什么我会得到不同的刻度值?

+0

***您正在使用什么数据库***(以及哪个版本),以及您的列在数据库表中具有哪些**数据类型**? –

回答

8

我强烈怀疑你在数据库中使用的类型不具有相同的精确度 - 我怀疑它只能精确到毫秒。

如果你想往返时间,你应该截断你的“输入”时间到最接近的毫秒。例如:

TimeSpan rounded = TimeSpan.FromMilliseconds(original.Ticks/10000); 

或者为DateTime

DateTime rounded = new DateTime(original.Year, original.Month, original.Day, 
    original.Hour, original.Minute, original.Second, original.Millisecond, 
    original.Kind); 

你也应该考虑是否真的要采取本地时间(这取决于系统时区)或UTC值。它取决于上下文,但更适合存储时间戳的UTC值,这就是您在这里看到的。

+0

只是补充一点:它可能也值得使用数据库服务器的时钟而不是应用程序服务器的时钟(例如t-sql中的'GETUTCDATE()'等) –