我有以下 ASP.Net MVC 控制器方法:
public ActionResult DoSomething(DateTime utcDate)
{
var localTime = utcDate.ToLocalTime();
}
问题是 localTime 将具有与 utcDate 完全相同的值。我认为这是因为 utcDate 不知道它具有 UTC 值。所以我的问题是如何将 utcDate(我知道是 UTC)转换为本地?
如果您知道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()
仅当以下一项(或两项)成立时才不会影响该值:
DateTime
是Kind
DateTimeKind.Local
我认为我们可以假设第二点是不正确的。因此,似乎iKnowThisIsUtc
'Kind
属性已设置为Local
。您需要弄清楚为什么向您提供这些DateTime
s 的任何东西都认为它们是本地的。
尝试以下操作:
public static DateTime UtcToPacific(DateTime dateTime)
{
return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
}
显然将太平洋更改为您当地的时区。
如果您想了解您的机器上存在哪些时区,请参阅以下链接:http: //msdn.microsoft.com/en-us/library/bb397781.aspx
如 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();
或这个:
var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
.ToLocalTime().DateTime;