20

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

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

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

4

4 回答 4

48

如果您知道DateTime包含 UTC 值,则可以使用以下内容

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

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

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

  • 的属性DateTimeKindDateTimeKind.Local
  • 您当地的时区是这样的,“没有变化”是正确的转换

我认为我们可以假设第二点是不正确的。因此,似乎iKnowThisIsUtc'Kind属性已设置为Local。您需要弄清楚为什么向您提供这些DateTimes 的任何东西都认为它们是本地的。

于 2012-10-17T15:39:23.163 回答
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

于 2012-10-17T15:38:49.670 回答
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();
于 2012-10-17T15:45:13.547 回答
1

或这个:

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;
于 2012-10-17T15:43:12.133 回答