c#-Azure中的TimeZone偏移量不正确

提问

Update – the problem didn’t lie within the extension method

As it turned out, there was no actual problem with my extension method. When I feed it with a DateTime straight from the webserver like so DateTime.UtcNow.ToUserLocalTime() I realized that the method was actually producing the correct result. The problem was instead that I accidentally called it twice on the DateTimes that were displayed incorrectly – first in the controller and then again in the view. A really stupid mistake, realized after beating my head against the wall for hours. From now on it is called from the controller only.

我在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.在本地环境中获得欧洲标准时间时,我得到2011-12-02 14:46 :22是正确的.但是,当我在Azure中运行完全相同的代码时,从包含完全相同的DateTime和所选时区的SQL-Azure数据库中读取,我得到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);,假设您的日期始终为Unspecified类型

要么

还是夏令时搞砸了?参见http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/92696af4-5169-4015-90eb-79da3c5136c2/

要对此进行测试,请尝试通过单击计算机时钟和“更改日期和时间设置”来更改时区的页面.然后取消选中/选中“自动调整夏令时”.

评论