更新 - 问题并不在扩展方法中
事实证明,我的扩展方法没有实际问题。当我像这样从web服务器直接输入DateTime.UtcNow.ToUserLocalTime()时,我意识到该方法实际上正在产生正确的结果。问题是我在错误地显示的DateTimes上意外地调用了两次该方法 - 首先在控制器中,然后又在视图中。一个非常愚蠢的错误,在撞了几个小时的墙后才意识到。从现在开始,它只在控制器中被调用。
我在Azure中运行的ASP.Net MVC3应用程序中存在一个时区转换问题。当我在本地运行应用程序时,一切都很正常,但是当我在Azure中运行完全相同的代码时,它会多出1个小时。
我创建了一个DateTime的扩展方法,用于根据用户选择的时区将DateTime转换。所有DateTimes都存储为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 数据库获取日期时间 2011-12-02 13:46:22
并通过我的 ToUserLocalTime 方法将其转换为本地环境中的 W. Europe Standard Time
,我得到的结果是 2011-12-02 14:46:22
,这是正确的。然而,当我在 Azure 中运行完全相同的代码,从我的 SQL-Azure 数据库中读取包含完全相同日期时间和所选时区的数据时,我得到的结果是 2011-12-02 15:46:22
。这让我感到困惑,为什么会相差一个小时呢?
我真的不知道如何调试这个问题,因为我无法在本地重现它。有没有一种方法可以在 Azure 角色中进行调试,以便我可以查看代码中实际发生了什么?类似于 Visual Studio 中的调试器之类的东西?
我尝试在发布应用程序时启用 IntelliTrace,但当我这样做时,应用程序无法启动,并在连接到 Azure-SQL 数据库时出现连接错误。我没有 IntelliTrace 的经验,生成的日志能告诉我关于这里发生了什么吗?在这种情况下花时间让 IntelliTrace 工作是否值得呢?
如果您对可能出现的问题或如何调试它有任何想法,那将不胜感激。