将UTC转换为本地时间会返回奇怪的结果

Her*_*rdo 6 c# sql-server asp.net datetime utc

我有三个项目的解决方案:

  1. 核心
  2. Outlook加载项
  3. 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
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)

Her*_*rdo 1

我现在解决了这个问题。开始和结束的值DateTime未正确转换:这些值未转换为当地时间。

网站将时间显示为当地时间的原因是,SQL 服务器将每个值DateTime存储为而DateTimeKind.Unspecified不是在插入期间保留指定的数据(例如)。DateTimeKind.Utc从服务器读取数据时,所有的 Kind 都是DateTimeKind.Unspecified,所以 的.ToString()使用DateTime的是本地的 kind。结果是UTC 时间 + 本地 UTC 偏移量。