我在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吗?如果是这样,我做错了什么?
答案 0 :(得分:2)
你在不同的时区。在UTC中使用DateTime
,或者更好地避免使用DateTimeOffset
的所有奇怪之处。
与.NET的DateTime
类型不同,数据库没有“种类”,表明它们是本地日期还是UTC日期。这使得它们非常容易使用不一致甚至没有意识到它。 DateTimeOffset
存储与UTC的偏移量,因此它没有相同的问题。
答案 1 :(得分:0)
尝试使用DateTime.UtcNow
而不是DateTime.Now