Неправильное смещение часового пояса в Azure - PullRequest
3 голосов
/ 20 февраля 2012

Обновление - проблема не заключалась в методе расширения

Как оказалось, с моим методом расширения проблем не было.Когда я кормил его DateTime прямо с веб-сервера, например DateTime.UtcNow.ToUserLocalTime(), я понял, что метод на самом деле дает правильный результат.Проблема заключалась в том, что я случайно вызвал его дважды в DateTimes, которые отображались некорректно - сначала в контроллере, а затем снова в представлении.По-настоящему глупая ошибка, которая осозналась после того, как я несколько часов бил головой об стену.Отныне он вызывается только из контроллера.

У меня проблема с преобразованием часового пояса в приложении ASP.Net MVC3, работающем в Azure.Когда я запускаю приложение локально, все работает просто отлично, однако когда я запускаю точно такой же код в 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.

Когда я получаю DateTime 2011-12-02 13:46:22из моей локальной базы данных SQL и запуска через метод 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 Ответ

4 голосов
/ 20 февраля 2012

Как насчет использования

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

OR

Или это может быть дневной свет, который все портит? См http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/92696af4-5169-4015-90eb-79da3c5136c2/

Чтобы проверить это, попробуйте перейти на страницу, которая меняет ваш часовой пояс, нажав на часы вашего компьютера и «Изменить настройки даты и времени». Затем снимите флажок или установите флажок «Автоматически настраивать время для перехода на летнее время».

...