2012-10-17 195 views
11

我有以下的ASP.Net MVC控制器的方法:转换UTC日期时间当地日期时间

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

的问题是,LOCALTIME将具有完全相同的值utcDate。我认为这是因为utcDate不知道它有一个UTC值。所以我的问题是如何将utcDate(我知道是UTC)转换为本地?

+0

你知不知道你是什么时区 – elyashiv

回答

35

如果您知道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()只有在以下情况之一(或两者)持有不影响值:

  • DateTimeKind属性是DateTimeKind.Local
  • 你的本地时区是这样的:“没有改变“是正确的转换

我认为我们可以假设第二点是不正确的。因此,iKnowThisIsUtcKind属性已经设置为Local。你需要弄清楚为什么要提供这些DateTime s认为它们是本地的。

+0

NB据我所知的唯一途径'ToLocalTime()'会_not change_值如果运行时认为的时间_已经是本地_。*(即,它有'DateTimeKind.Local'。)你可能想要检查是否是这种情况,如果是这样,为什么你得到的日期被标记为'Local',尽管它们不是。 (*或如果当地时间是当然UTC) – Rawling

+0

+1打我的评论中添加的解释,虽然我真的认为它属于答案的一部分。 –

+0

当我回顾这段时间后,发现它很混乱。你的答案在解释它时做得很好,但一些例子可能会有所帮助。 – TylerOhlsen

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

1

或本:

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