将UTC日期时间转换为本地日期时间

21

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

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

问题在于localTime将具有与utcDate完全相同的值。我认为这是因为utcDate不知道它具有UTC值。因此,我的问题是如何将我知道是UTC的utcDate转换为本地时间?


你知道你所在的时区吗? - elyashiv
4个回答

49
如果您知道 DateTime 包含 UTC 值,可以使用如下方法
DateTime iKnowThisIsUtc = whatever;
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc,
    DateTimeKind.Utc);
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime();
例如,在我的当前应用程序中,我使用 SQL 的 utcnow 创建数据库中的时间戳,但当我将它们读入我的 C# 应用程序时,Kind 属性总是 Unknown。我创建了一个包装函数来读取时间戳,有意将其 Kind 设置为 Utc,然后转换为本地时间 - 基本上就像上面那样。
请注意,DateTime.ToLocalTime() 仅在以下情况下不会影响值:
  • DateTimeKind 属性为 DateTimeKind.Local
  • 您的本地时区使“无更改”成为正确的转换
我认为我们可以假设第二点不是真的。因此,看起来 iKnowThisIsUtcKind 属性已经设置为 Local。你需要弄清楚为什么提供给你这些 DateTime 的东西认为它们是本地的。

当您将+1添加到答案时,请考虑为问题投票-如果您发现它有用的话。 - Chris W
你还需要检查服务器时区是否设置正确,例如如果服务器设置为UTC时间,它将不会进行任何转换,因为它认为UTC和本地时间是相同的。 - Quintus Marais
@QuintusMarais 嗯...是的。如果服务器不知道本地时间,你不能期望它做任何“本地时间”的事情。 - Rawling
@Rawling 只是指出我见过许多人被绊倒的事情。他们可能不会想要检查服务器时区是否设置正确,然后可能不明显的是代码可能是正确的,而服务器设置不正确。 - Quintus Marais
4
这个示例代码中的变量名称非常好。谢谢。 - pettys
显示剩余4条评论

5

请尝试以下方法:

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

显然,将太平洋时区更改为本地时区。

如果您想查找计算机上存在哪些时区,请参见以下链接:http://msdn.microsoft.com/en-us/library/bb397781.aspx


5

3
或者这个:
var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;

你的解决方案对我有效。谢谢! - Thanh Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接