更新-问题不在于扩展方法
事实证明,我的扩展方法没有实际问题。当我像
DateTime.UtcNow.ToUserLocalTime()
一样直接从Web服务器向它提供DateTime时,我意识到该方法实际上产生了正确的结果。问题是,我不小心在DateTimes上调用了两次,但都显示错误——第一次在控制器中,然后又在视图中。一个非常愚蠢的错误,在我的头撞在墙上几个小时后才意识到。从现在起,它只能从控制器中调用。
我在Azure中运行的ASP.Net MVC3应用程序中遇到时区转换问题。当我在本地运行应用程序时,一切都很好,但当我在Azure中运行完全相同的代码时,它最终会关闭+1小时。
我为DateTime创建了一个扩展方法,用于根据用户选择的时区转换DateTime。所有日期时间都存储在UTC中。
public static DateTime ToUserLocalTime(this DateTime date)
{
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
if (!string.IsNullOrEmpty(SecurityContext.CurrentUser.TimeZone))
{
var timezone = SecurityContext.CurrentUser.TimeZone;
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timezone);
return TimeZoneInfo.ConvertTime(date, timeZoneInfo);
}
return date;
}
SecurityContext.CurrentUser.TimeZone
是时区的字符串表示,在我的例子中是W. Europe Standard Time
。
当我从本地SQL数据库中获得DateTime 2011-12-02 13:46:22
并通过ToUserLocalTime方法运行它时,在本地环境中将其转换为W. Europe Standard Time
,我得到了正确的2011-12-02 14:46:22
。然而,当我在Azure中运行完全相同的代码时,从我的SQL Azure数据库中读取,其中包含完全相同的DateTime和所选时区,我得到2011-12-02 15:46:22
。这让我很困惑,为什么最后会休息一个小时?
我真的不知道如何调试它,因为我无法在本地复制它。有没有一种方法可以在Azure角色中调试它,这样我就可以看到代码中到底发生了什么?像Visual Studio中的调试器吗?
当我发布应用程序时,我试图启用IntelliTrace,但当我这样做时,应用程序无法启动,抱怨在连接到Azure SQL数据库时出现连接错误。我没有IntelliTrace的经验,生成的日志能告诉我这里发生了什么吗?在这种情况下,花时间让InteliTrace发挥作用值得吗?
如果您对这里可能出现的问题或如何调试它有任何想法,我们将不胜感激。
使用怎么样
return TimeZoneInfo.ConvertTimeFromUTCTime(date, timeZoneInfo);
而不是
return TimeZoneInfo.ConvertTime(date, timeZoneInfo);
参考:http://social.msdn.microsoft.com/Forums/en-AU/windowsazuredevelopment/thread/04be9d07-fcdb-4bf2-b380-57c062382409
然后,您可以删除date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
行,假设您的日期总是具有未指定类型的
或
还是夏令时把事情搞砸了?看见http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/92696af4-5169-4015-90eb-79da3c5136c2/
要测试这一点,请尝试转到更改时区的页面,方法是单击计算机时钟并"更改日期和时间设置"。然后取消选中/选中"自动调整夏令时时间"。