Обновление - проблема не заключалась в методе расширения
Как оказалось, с моим методом расширения проблем не было.Когда я кормил его 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 работать в этом случае?
Буду очень признателен за любые идеи о том, что здесь может быть не так или как отладить.