在Azure中时区偏移量不正确。

3

更新 - 问题并不在扩展方法中

事实证明,我的扩展方法没有实际问题。当我像这样从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 工作是否值得呢?

如果您对可能出现的问题或如何调试它有任何想法,那将不胜感激。


你在模拟器中运行SQL Azure数据库时是否遇到了同样的问题?如果是,你可以使用Visual Studio进行故障排除。 - Tom
@Tom 我会尝试的,谢谢! - Christofer Eliasson
1个回答

4
使用什么呢?
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/

为了测试,尝试进入更改时区的页面,方法是单击计算机时钟上的“更改日期和时间设置”选项。然后取消勾选“为夏令时自动调整时间”选项。


谢谢你的回答!我尝试使用ConvertTimeFromUtc,但不幸的是它没有帮助。我认为这不是夏令时问题,但我不确定。 - Christofer Eliasson
修改了夏令时测试程序。时间差1小时听起来像是夏令时出了问题。 - Jeow Li Huan
谢谢您的更新,不幸的是在本地没有任何区别。无论我是否勾选“自动调整夏令时”设置,我都能得到相同的正确结果。 - Christofer Eliasson
在苦思冥想了数小时之后,我意识到问题并不在于扩展方法,你的解决方案起作用了(我的也一样)。如果感兴趣,可以查看我更新的问题所在。无论如何,感谢您的所有帮助! - Christofer Eliasson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接