本地计算机和Azure之间的DateTime不一致

时间:2014-01-11 20:35:21

标签: c# asp.net entity-framework asp.net-mvc-4 azure-sql-database

我在Azure网站上托管了一个应用。使用托管应用程序时,将正确显示和保存日期时间。当我在本地运行应用程序,并从Azure SQL数据库中提取数据时,我得到了非常奇怪的结果。每个日期时间似乎都是6个小时。

如果我在本地盒子上并从服务器提取数据,则所有日期时间都显示为实际+ 6小时。

如果我那么,从本地方框,将内容发布到Azure SQL,时间将保存为实际6小时。

我正在谈论的读/写的一个例子:

写:

        var chatMessage = new ChatMessage() {
                    DatePosted = DateTime.Now
                                        };
        db.ChatMessages.Add(chatMessage);

读:

       // get chatMessage from db
       messageVm.DateIndicator = DateUtilities.GetFriendlyDate(chatMessage.DatePosted);
       // GetFriendlyDate is:
       public static string GetFriendlyDate(DateTime? postDate) {
        if (postDate == null) {
            return null;
        }
        string stringy = string.Empty;
        TimeSpan diff = DateTime.Now.Subtract((DateTime) postDate);
        double days = diff.Days;
        double hours = diff.Hours + days * 24;
        double minutes = diff.Minutes + hours * 60;
        if (minutes <= 1) {
            return "Just Now";
        }
        // etc
        }

所以在上面的阅读 - 如果我在本地运行应用程序并访问Azure SQL,5小时前发布的内容将显示为“Just Now”,如果我保存新消息,托管应用程序将显示时间为6小时前(应该是“刚才”)。

从db(azure)拆分逻辑(本地)显然是导致这种情况的原因 - 但是这表明我没有正确处理DateTimes吗?如果是这样,我做错了什么?

2 个答案:

答案 0 :(得分:2)

你在不同的时区。在UTC中使用DateTime,或者更好地避免使用DateTimeOffset的所有奇怪之处。

与.NET的DateTime类型不同,数据库没有“种类”,表明它们是本地日期还是UTC日期。这使得它们非常容易使用不一致甚至没有意识到它。 DateTimeOffset存储与UTC的偏移量,因此它没有相同的问题。

答案 1 :(得分:0)

尝试使用DateTime.UtcNow而不是DateTime.Now