【问题标题】:Converting UTC to local time returns strange result将 UTC 转换为本地时间会返回奇怪的结果
【发布时间】:2013-07-31 23:49:30
【问题描述】:

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

  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

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 加载项使用相同的方法返回正确的结果?那么选秀权也应该被“破坏”。还是不行?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2018-07-27
    • 2016-08-06
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多