Azure中的时区偏移量不正确



更新-问题不在于扩展方法

事实证明,我的扩展方法没有实际问题。当我像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/

要测试这一点,请尝试转到更改时区的页面,方法是单击计算机时钟并"更改日期和时间设置"。然后取消选中/选中"自动调整夏令时时间"。

相关内容

  • 没有找到相关文章

最新更新