Преобразования времени UTC в местное время возвращает странный результат
У меня есть решение трех проектов:
- ядро
- Надстройка Outlook
- 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 ответ:
Теперь я решил эту проблему. Значения
DateTime
для начала и конца не были правильно преобразованы: значения не были приведены к местному времени.Причина , Почему веб-сайт отображал время как местное время, заключается в том, что SQL-сервер хранит каждое значение
DateTime
какDateTimeKind.Unspecified
вместо сохранения указанных данных (например,DateTimeKind.Utc
) во время вставки. При чтении данных с сервера все виды являютсяDateTimeKind.Unspecified
, поэтому.ToString()
изDateTime
использует локальный вид. Это приводит к UTC время + местный часовой пояс.