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