UTC date.ToLocalTime()仍以UTC时间生成日期

时间:2017-08-24 16:24:36

标签: c# asp.net date datetime xamarin.ios

我正在使用ASP.Net后端。我在UTC时间将所有日期从客户端保存到数据库。

我在后端有一个导出一些记录的功能,我希望在显示之前将提取的日期从UTC时间转换为用户的当地时间。

我已经在StackOverflow上尝试了大量的解决方案,但它们似乎都没有将日期转换为本地时间,即使这在客户端显示其中一些日期时也有效。我怀疑服务器已经认为日期是在当地时间,但我不确定如何解决它。

以下是我尝试的不同解决方案:

//1.

var alertTime = record.TimeRecorded.GetValueOrDefault().ToLocalTime().ToString("hh:mm tt");


// 2.
var alertTime = record.TimeRecorded;

 if (alertTime.HasValue)
    {
      var timeInUtc = TimeZoneInfo.ConvertTimeToUtc(alertTime.Value);
     string alertTimeToLocalTime = timeInUtc.ToLocalTime().ToString("hh:mm tt");

    }

 //alertTimeToLocalTime is still in UTC time here

// 3.

if (alertTime.HasValue)
    {
        var localTime = TimeZoneInfo.ConvertTimeFromUtc(timeInUtc, TimeZoneInfo.Local);
       string alertTimeToLocalTime = localTime.ToString("hh:mm tt");

    }

这些都没有设法将alertTime转换为本地时间。

我错过了什么吗?

修改

//4. Another approach I had already tried which didn't work as well

var alertTime = DateTime.SpecifyKind(record.TimeRecorded.GetValueOrDefault(), DateTimeKind.Utc);
alertTimeToLocalTime = alertTime.ToLocalTime().ToString("hh:mm tt");

2 个答案:

答案 0 :(得分:1)

这是因为您DateTime的{​​{3}}是LocalUnspecified。请参阅Kind

  

从.NET Framework 2.0版开始,ToLocalTime方法返回的值由当前DateTime对象的Kind属性确定。下表描述了可能的结果。

     
      
  • Utc - 此DateTime实例将转换为本地时间。

  •   
  • 本地 - 不执行转换。

  •   
  • 未指定 - 假定此DateTime实例为UTC时间,并且执行转换,就像Kind是Utc一样。

  •   

您可以在进行转换之前使用documentation for ToLocalTime()设置种类。

答案 1 :(得分:1)

你说:

  

...从UTC时间到用户当地时间...

ASP.Net中的任何内容都不会告诉您用户的本地时区。调用ToLocalTime将从UTC转换为服务器的时区(除非.Kind已经DateTimeKind.Local)。

在许多情况下,将服务器的时区设置为UTC的最佳做法意味着除了ToLocalTimeToUniversalTime之外,您将看不到任何更改。由于服务器的时区在大多数情况下都不相关,因此这不是正确的方法。

相反,您需要通过其他一些机制(例如他们在您的应用程序中选择它)来了解用户的时区,这样您就可以使用TimeZoneInfo.ConvertTime(或Noda Time)转换服务器 - 或者你需要将UTC时间发送到客户端并在JavaScript中执行utc-to-local(因为浏览器在用户的时区运行)。

通常,应避免在服务器应用程序(如ASP.NET)中使用“本地时间”。其中包括ToLocalTimeToUniversalTimeDateTimeKind.LocalTimeZoneInfo.LocalDateTime.Now以及其他一些杂项内容。

相关问题