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



我有一个托管在Azure网站上的应用程序。使用托管应用程序时,DateTimes会正确显示和保存。当我在本地运行应用程序,并从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小时前发布的内容将显示为发布的"刚刚",如果我保存了一条新消息,托管应用程序将显示时间为6小时前(此时应为"刚刚")。

将逻辑(local)与数据库(azure)分离显然是造成这种情况的原因,但这是否表明我没有正确处理DateTimes?如果是,我做错了什么?

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

与.NET的DateTime类型不同,数据库没有表示它们是本地日期还是UTC日期的"Kind"。这使得它们很容易不一致地使用,甚至没有意识到这一点。DateTimeOffset存储了与UTC的偏移量,因此它没有同样的问题。

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

最新更新