Преобразования времени UTC в местное время возвращает странный результат


У меня есть решение трех проектов:

  1. ядро
  2. Надстройка Outlook
  3. ASP.NET сайт

Как надстройка Outlook, так и веб-сайт используют одни и те же методы из Основного проекта для получения данных из SQL Server. Когда я записываю свои данные в базу данных, я преобразую все DateTime значения двух таблиц в UTC time:

POLL_START              POLL_END
2013-07-31 12:00:00.000 2013-08-01 12:00:00.000

И

PICK_DATE
2013-07-31 12:00:48.000
2013-07-31 13:00:12.000

Когда я получаю данные в моей надстройке Outlook, это правильно результат :

Введите описание изображения здесьВведите описание изображения здесь

При открытии того же самого на моем веб-сайте, выбор хорош:

Введите описание изображения здесь

Но мое время начала и окончания "сломано" - добавлено смещение, bute используются неправильные часы:

Введите описание изображения здесь

Вот код для моего преобразования, который используют как Outlook, так и веб-сайт:

private static void ConvertToLocalTime(POLL item)
{
    item.POLL_START = item.POLL_START.FromUTC();
    item.POLL_END = item.POLL_END.FromUTC();
}

private static void ConvertToLocalTime(PICK pick)
{
    if (pick.PICK_DATE != null) pick.PICK_DATE = ((DateTime)pick.PICK_DATE).FromUTC();
}

И реализация DateTime.FromUtc():

public static DateTime FromUTC(this DateTime value)
{
    var local = TimeZoneInfo.Local;
    return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.Utc, local);
}

У меня был тот же результат с DateTime.ToLocalTime(). У кого-нибудь есть идея?

Править 1:

Именно так начало и конец отображаются на веб-сайте (конец с End вместо Start):

var startCell = new TableCell
        {
            Text = String.Format(
                @"<a href='{0}' title='{2}' target='_blank'>{1:dd.MM.yyyy HH:mm UTCzzz}</a>",
                    Common.GetTimeAndDateHyperlink(_poll.Start, "Vote Start"),
                    _poll.Start,
                    ConvertToLocalTimeZone),
            CssClass = "InfoContent"
        };

И кирки:

answerCell = new TableCell
            {
                Text = String.Format(
                    @"<a href='{0}' title='{2}' target='_blank'>{1}</a>",
                        Common.GetTimeAndDateHyperlink(ao.Time, ao.RealAnswer),
                        ao.RealAnswer,
                        ConvertToLocalTimeZone)
            };

ao.RealAnswer возвращает формализованную строку DateTime:

return String.Format(WholeTime == true ? "{0:d}" : @"{0:dd.MM.yyyy HH:mm UTCzzz}", Time);
1 6

1 ответ:

Теперь я решил эту проблему. Значения DateTime для начала и конца не были правильно преобразованы: значения не были приведены к местному времени.

Причина , Почему веб-сайт отображал время как местное время, заключается в том, что SQL-сервер хранит каждое значение DateTime как DateTimeKind.Unspecified вместо сохранения указанных данных (например, DateTimeKind.Utc) во время вставки. При чтении данных с сервера все виды являются DateTimeKind.Unspecified, поэтому .ToString() из DateTime использует локальный вид. Это приводит к UTC время + местный часовой пояс.