将 UTC 转换为本地时间会返回奇怪的结果
Posted
技术标签:
【中文标题】将 UTC 转换为本地时间会返回奇怪的结果【英文标题】:Converting UTC to local time returns strange result 【发布时间】:2013-07-31 23:49:30 【问题描述】:我有三个项目的解决方案:
-
核心
Outlook 插件
ASP.NET 网站
Outlook 加载项和网站都使用 Core 项目中的相同方法从 SQL Server 获取数据。当我将数据写入数据库时,我将两个表的所有 DateTime
值转换为 UTC 时间:
POLL_START POLL_END
2013-07-31 12:00:00.000 2013-08-01 12:00:00.000
和
PICK_DATE
2013-07-31 12:00:48.000
2013-07-31 13:00:12.000
当我在 Outlook 加载项中获取数据时,这是正确的结果:
在我的网站上打开相同的内容时,选择很好:
但是我的开始和结束时间被“破坏”了 - 添加了偏移量,但是使用了错误的时间:
这是我的转换代码,Outlook 和网站都使用:
private static void ConvertToLocalTime(POLL item)
item.POLL_START = item.POLL_START.FromUTC();
item.POLL_END = item.POLL_END.FromUTC();
private static void ConvertToLocalTime(PICK pick)
if (pick.PICK_DATE != null) pick.PICK_DATE = ((DateTime)pick.PICK_DATE).FromUTC();
以及DateTime.FromUtc()
的实现:
public static DateTime FromUTC(this DateTime value)
var local = TimeZoneInfo.Local;
return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.Utc, local);
DateTime.ToLocalTime()
的结果相同。
有人有想法吗?
编辑 1:
这是开始和结束在网站上的显示方式(以End
结尾而不是Start
):
var startCell = new TableCell
Text = String.Format(
@"<a href='0' title='2' target='_blank'>1:dd.MM.yyyy HH:mm \U\T\Czzz</a>",
Common.GetTimeAndDateHyperlink(_poll.Start, "Vote Start"),
_poll.Start,
ConvertToLocalTimeZone),
CssClass = "InfoContent"
;
还有选择:
answerCell = new TableCell
Text = String.Format(
@"<a href='0' title='2' target='_blank'>1</a>",
Common.GetTimeAndDateHyperlink(ao.Time, ao.RealAnswer),
ao.RealAnswer,
ConvertToLocalTimeZone)
;
ao.RealAnswer
返回格式化的 DateTime 字符串:
return String.Format(WholeTime == true ? "0:d" : @"0:dd.MM.yyyy HH:mm \U\T\Czzz", Time);
【问题讨论】:
您在网页上显示时间的代码是什么? @Romoku 添加了代码 我猜Kind 属性在两者之间是不同的。 @Greg 但是为什么 Outlook 加载项使用相同的方法返回正确的结果?那么选秀权也应该被“破坏”。还是不行? 【参考方案1】:我现在解决了这个问题。开始和结束的 DateTime
值未正确转换:这些值未转换为本地时间。
原因,网站将时间显示为当地时间的原因是,SQL 服务器将每个DateTime
值存储为DateTimeKind.Unspecified
,而不是保持指定插入期间的数据(例如DateTimeKind.Utc
)。从服务器读取数据的时候,所有的Kinds都是DateTimeKind.Unspecified
,所以DateTime
的.ToString()
使用的是本地的kinds。这导致 UTC 时间 + 本地 UTC 偏移量。
【讨论】:
以上是关于将 UTC 转换为本地时间会返回奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章
将UTC日期字符串转为本地时间字符串,如@"yyyy-MM-dd'T'HH:mm:ssZ"转换为本地时间