Her*_*rdo 6 c# sql-server asp.net datetime utc
我有三个项目的解决方案:
Outlook加载项和网站都使用与Core项目相同的方法从SQL Server获取数据.当我将数据写入数据库时,我将DateTime两个表的所有值转换为UTC时间:
POLL_START POLL_END
2013-07-31 12:00:00.000 2013-08-01 12:00:00.000
Run Code Online (Sandbox Code Playgroud)
和
PICK_DATE
2013-07-31 12:00:48.000
2013-07-31 13:00:12.000
Run Code Online (Sandbox Code Playgroud)
当我在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();
}
Run Code Online (Sandbox Code Playgroud)
并执行DateTime.FromUtc():
public static DateTime FromUTC(this DateTime value)
{
var local = TimeZoneInfo.Local;
return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.Utc, local);
}
Run Code Online (Sandbox Code Playgroud)
我有同样的结果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"
};
Run Code Online (Sandbox Code Playgroud)
选秀权:
answerCell = new TableCell
{
Text = String.Format(
@"<a href='{0}' title='{2}' target='_blank'>{1}</a>",
Common.GetTimeAndDateHyperlink(ao.Time, ao.RealAnswer),
ao.RealAnswer,
ConvertToLocalTimeZone)
};
Run Code Online (Sandbox Code Playgroud)
ao.RealAnswer 返回格式化的DateTime字符串:
return String.Format(WholeTime == true ? "{0:d}" : @"{0:dd.MM.yyyy HH:mm \U\T\Czzz}", Time);
Run Code Online (Sandbox Code Playgroud)
我现在解决了这个问题。开始和结束的值DateTime未正确转换:这些值未转换为当地时间。
网站将时间显示为当地时间的原因是,SQL 服务器将每个值DateTime存储为而DateTimeKind.Unspecified不是在插入期间保留指定的数据(例如)。DateTimeKind.Utc从服务器读取数据时,所有的 Kind 都是DateTimeKind.Unspecified,所以 的.ToString()使用DateTime的是本地的 kind。结果是UTC 时间 + 本地 UTC 偏移量。