Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将UTC日期时间转换为本地日期时间_C#_Datetime_Utc - Fatal编程技术网

C# 将UTC日期时间转换为本地日期时间

C# 将UTC日期时间转换为本地日期时间,c#,datetime,utc,C#,Datetime,Utc,我有以下ASP.Net MVC控制器方法: public ActionResult DoSomething(DateTime utcDate) { var localTime = utcDate.ToLocalTime(); } 问题是localTime的值与utcDate的值完全相同。我认为这是因为utcDate不知道它有UTC值。因此,我的问题是如何将utcDate(我知道是UTC)转换为本地?尝试以下方法: public static DateTime UtcToPacific(D

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

public ActionResult DoSomething(DateTime utcDate)
{
   var localTime = utcDate.ToLocalTime();
}
问题是localTime的值与utcDate的值完全相同。我认为这是因为utcDate不知道它有UTC值。因此,我的问题是如何将utcDate(我知道是UTC)转换为本地?

尝试以下方法:

public static DateTime UtcToPacific(DateTime dateTime)
        {
            return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
        }
显然,将太平洋改为您当地的时区

如果您想了解您的机器上存在哪些时区,请参阅以下链接:

如果您知道
日期时间
包含UTC值,您可以使用:

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

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

  • DateTime
    Kind
    属性是
    DateTimeKind.Local
  • 您的本地时区是这样的,“不改变”是正确的转换
我想我们可以假设第二点不是真的。因此,
iKnowThisIsUtc
Kind
属性似乎已经设置为
Local
。您需要弄清楚为什么向您提供这些
日期时间的任何东西都认为它们是本地的。

或者:

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

如MSDN所述,您需要将日期的种类属性设置为UTC,以便ToLocalTime()工作(并将日期转换为本地时间)

试试这个:

utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();

您知道您所在的时区吗?注意,
ToLocalTime()
唯一不会更改该值的方法是运行时认为时间已经是本地时间。*(即它具有
DateTimeKind.local
)您可能需要检查是否是这种情况,如果是,为什么您得到的日期被标记为
Local
,即使它们不是。(*或者如果当地时间当然是UTC)如果我真的认为它是答案的一部分的话,我会认为它是答案的一部分。当我回过头来看这个问题的时候,我发现它非常混乱。你的回答的确解释得很好,但是一些例子可能会有帮助。当你给答案加上1的时候,也要考虑一下这个问题。如果你觉得有用的话。这个示例代码中的变量名非常完美。谢谢。
utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();