将UTC DateTime转换为本地DateTime

时间:2012-10-17 15:36:17

标签: c# datetime utc

我有以下ASP.Net MVC控制器方法:

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

问题是localTime将具有与utcDate完全相同的值。我假设这是因为utcDate不知道它具有UTC值。所以我的问题是如何将utcDate(我知道是UTC)转换为本地?

4 个答案:

答案 0 :(得分:42)

如果您知道 DateTime包含UTC值,您可以使用the following

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

例如,在我当前的应用程序中,我使用SQL utcnow在我的数据库中创建时间戳,但是当我将它们读入我的C#应用​​程序时,Kind proeprty始终为Unknown。我创建了一个包装器函数来读取时间戳,故意将其Kind设置为Utc,然后将其转换为本地时间 - 基本上如上所述。

请注意,DateTime.ToLocalTime()仅在以下一个(或两个)成立时才会影响该值:

  • DateTime的{​​{1}}属性为Kind
  • 您当地的时区是“无变化”是正确的转化

我认为我们可以假设第二点不正确。因此,似乎DateTimeKind.Local的{​​{1}}属性已设置为iKnowThisIsUtc。你需要弄清楚为什么这些Kind认为它们是本地的。

答案 1 :(得分:5)

如MSDN所述,您需要将Date的Kind属性设置为UTC,以使ToLocalTime()起作用(并将日期转换为本地时间。http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

试试这个:

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

答案 2 :(得分:4)

尝试以下方法:

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

显然将Pacific更改为您当地的时区。

如果您想了解计算机上的时区,请参阅以下链接:http://msdn.microsoft.com/en-us/library/bb397781.aspx

答案 3 :(得分:1)

或者这个:

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