我有以下的ASP.Net MVC控制器的方法:转换UTC日期时间当地日期时间
public ActionResult DoSomething(DateTime utcDate)
{
var localTime = utcDate.ToLocalTime();
}
的问题是,LOCALTIME将具有完全相同的值utcDate。我认为这是因为utcDate不知道它有一个UTC值。所以我的问题是如何将utcDate(我知道是UTC)转换为本地?
我有以下的ASP.Net MVC控制器的方法:转换UTC日期时间当地日期时间
public ActionResult DoSomething(DateTime utcDate)
{
var localTime = utcDate.ToLocalTime();
}
的问题是,LOCALTIME将具有完全相同的值utcDate。我认为这是因为utcDate不知道它有一个UTC值。所以我的问题是如何将utcDate(我知道是UTC)转换为本地?
如果您知道的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
的Kind
属性是DateTimeKind.Local
我认为我们可以假设第二点是不正确的。因此,iKnowThisIsUtc
的Kind
属性已经设置为Local
。你需要弄清楚为什么要提供这些DateTime
s认为它们是本地的。
NB据我所知的唯一途径'ToLocalTime()'会_not change_值如果运行时认为的时间_已经是本地_。*(即,它有'DateTimeKind.Local'。)你可能想要检查是否是这种情况,如果是这样,为什么你得到的日期被标记为'Local',尽管它们不是。 (*或如果当地时间是当然UTC) – Rawling
+1打我的评论中添加的解释,虽然我真的认为它属于答案的一部分。 –
当我回顾这段时间后,发现它很混乱。你的答案在解释它时做得很好,但一些例子可能会有所帮助。 – TylerOhlsen
尝试以下操作:
public static DateTime UtcToPacific(DateTime dateTime)
{
return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
}
明显改变太平洋到本地时区。
如果您想了解哪些时区出现在您的机器请访问以下链接:http://msdn.microsoft.com/en-us/library/bb397781.aspx
或本:
var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
.ToLocalTime().DateTime;
由MSDN描述,你需要你的时间的一种属性为UTC,对于ToLocalTime()工作(和日期转换为本地时间http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
试试这个:
utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();
你知不知道你是什么时区 – elyashiv