我有三个项目的解决方案:
两者都是,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);
答案 0 :(得分:1)
我现在解决了这个问题。开始和结束的DateTime
值未正确转换:值未转换为当地时间。
原因,为什么网站以本地时间显示时间,SQL服务器将每个DateTime
值存储为DateTimeKind.Unspecified
,而不是保持指定的 数据(例如DateTimeKind.Utc
)在插入期间。从服务器读取数据时,所有种类都为DateTimeKind.Unspecified
,因此.ToString()
的{{1}}使用本地种类。这导致 UTC时间+本地UTC偏移。