【问题标题】:Converting UTC DateTime to local DateTime将 UTC 日期时间转换为本地日期时间
【发布时间】:2012-10-07 22:14:05
【问题描述】:

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

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

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

【问题讨论】:

  • 你知道你在哪个时区吗?

标签: c# datetime utc


【解决方案1】:

如果您知道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。您需要弄清楚为什么向您提供这些 DateTimes 的任何东西都认为它们是本地的。

【讨论】:

  • NB AFAIK ToLocalTime()不改变的唯一方法是如果运行时认为时间是已经是本地时间。*(即它有DateTimeKind.Local。)您可能想检查是否是这种情况,如果是这样,为什么您得到的日期被标记为Local,即使它们不是。 (* 或者如果本地时间当然是 UTC)
  • +1 击败我对您在评论中添加的解释,尽管我真的认为它属于答案的一部分。
  • 当我不久前研究这个时,我发现它非常令人困惑。您的回答确实可以很好地解释它,但一些示例可能会有所帮助。
  • 当您在答案中添加 +1 时,还可以考虑对问题进行投票 - 如果您觉得它有用。
  • 本示例代码中的变量名是完美的。谢谢。
【解决方案2】:

尝试以下方法:

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

显然将太平洋更改为您当地的时区。

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

【讨论】:

    【解决方案3】:

    如 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();
    

    【讨论】:

      【解决方案4】:

      或者这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 2019-06-21
        • 2011-06-13
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多