Преобразование UTC DateTime в локальную DateTime

У меня есть следующий метод ASP.Net MVC Controller:

public ActionResult DoSomething(DateTime utcDate)
{
   var localTime = utcDate.ToLocalTime();
}

Проблема в том, что localTime будет иметь то же значение, что и utcDate. Я предполагаю, что это потому, что utcDate не знает, что имеет значение UTC. Итак, мой вопрос в том, как я могу преобразовать utcDate (который я знаю UTC) в локальный?

Ответ 1

Если вы знаете, что DateTime содержит значение UTC, вы можете использовать следующее:

DateTime iKnowThisIsUtc = whatever;
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc,
    DateTimeKind.Utc);
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime();

Например, в моем текущем приложении, я создаю временные метки в моей базе данных с SQL utcnow, но когда я прочитал их в мое приложение С# Kind proeprty всегда Unknown. Я создал функцию обертки, чтобы прочитать метку времени, преднамеренно установить ее Kind в Utc, а затем преобразовать ее в локальное время - по существу, как указано выше.

Обратите внимание, что DateTime.ToLocalTime() только не влияет на значение, если выполнено одно (или оба) из следующих условий:

  • Свойством DateTime Kind является DateTimeKind.Local
  • Ваш часовой пояс таков, что "без изменений" - правильное преобразование

Я думаю, мы можем предположить, что второй пункт не соответствует действительности. Таким образом, кажется, что свойство iKnowThisIsUtc Kind установлено на Local уже. Вам нужно выяснить, почему все, что снабжает вас этими DateTime считает, что они локальные.

Ответ 2

как описано в MSDN, вам нужно свойство Kind вашей даты для UTC, для ToLocalTime() для работы (и преобразования даты в локальное время. http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

Попробуй это:

utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();

Ответ 3

Попробуйте следующее:

public static DateTime UtcToPacific(DateTime dateTime)
        {
            return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
        }

Очевидно, измените Тихий океан на свой часовой пояс.

Если вы хотите узнать, какие часовые пояса присутствуют на вашем компьютере, см. Следующую ссылку: http://msdn.microsoft.com/en-us/library/bb397781.aspx

Ответ 4

или это:

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;