Azure中的TimeZone偏移量不正确

时间:2012-02-20 16:07:44

标签: c# asp.net asp.net-mvc-3 azure timezone

  

更新 - 问题不在扩展方法

中      

事实证明,我的扩展方法没有实际问题。当我直接从网络服务器上用DateTime提供它时,DateTime.UtcNow.ToUserLocalTime()我意识到该方法实际上产生了正确的结果。问题是我不小心在日期时间上错误地调用了两次 - 首先在控制器中,然后再在视图中。这是一个非常愚蠢的错误,在我的头撞墙几个小时后实现了。从现在开始,它仅从控制器调用。

我在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在这种情况下工作?

对于这里可能出现的问题以及如何调试它的任何想法都将非常感激。

1 个答案:

答案 0 :(得分: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/

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