我正在使用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");
答案 0 :(得分:1)
这是因为您DateTime
的{{3}}是Local
或Unspecified
。请参阅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的最佳做法意味着除了ToLocalTime
或ToUniversalTime
之外,您将看不到任何更改。由于服务器的时区在大多数情况下都不相关,因此这不是正确的方法。
相反,您需要通过其他一些机制(例如他们在您的应用程序中选择它)来了解用户的时区,这样您就可以使用TimeZoneInfo.ConvertTime
(或Noda Time)转换服务器 - 或者你需要将UTC时间发送到客户端并在JavaScript中执行utc-to-local(因为浏览器在用户的时区运行)。
通常,应避免在服务器应用程序(如ASP.NET)中使用“本地时间”。其中包括ToLocalTime
,ToUniversalTime
,DateTimeKind.Local
,TimeZoneInfo.Local
,DateTime.Now
以及其他一些杂项内容。