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

时间:2013-07-31 12:37:40

标签: c# asp.net sql-server datetime utc

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

  1. 核心
  2. Outlook加载项
  3. ASP.NET网站
  4. 两者都是,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加载项中获取数据时,这是正确的结果

    enter image description here enter image description here

    在我的网站上打开相同内容时,选择很好:

    enter image description here

    但是我的开始和结束时间都“被打破” - 添加了偏移量,使用了错误的小时:

    enter image description here

    以下是我的转换代码,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);
    

1 个答案:

答案 0 :(得分:1)

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

原因,为什么网站以本地时间显示时间,SQL服务器将每个DateTime值存储为DateTimeKind.Unspecified,而不是保持指定的 数据(例如DateTimeKind.Utc)在插入期间。从服务器读取数据时,所有种类都为DateTimeKind.Unspecified,因此.ToString()的{​​{1}}使用本地种类。这导致 UTC时间+本地UTC偏移