Преобразование 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;