【问题标题】:convert utc time and offset to DateTime将 UTC 时间和偏移量转换为 DateTime
【发布时间】:2011-03-22 16:04:59
【问题描述】:

我在数据库中保存了一个日期时间(以 utc 表示),并且我还知道以下格式的 utc 偏移量。

-03:00:00

如何将其转换为DateTime

【问题讨论】:

  • 12:12:12 在我看来不像 UTC 偏移量,也不像 datetime 字段。能否详细说明每个部分的含义?
  • @Oded 它是 UTC 偏移量。它的范围是 -12:00:00 到 13:00:00

标签: c# datetime


【解决方案1】:

对已有的DateTime 应用“偏移”的最简单方法是创建一个保存偏移值的TimeSpan 结构,然后简单地将偏移“添加”到原始DateTime 值.

例如:

DateTime utcDateTime = DateTime.Parse("29 July 2010 14:13:45");
TimeSpan offSet = TimeSpan.Parse("-03:00:00");
DateTime newDateTime = utcDateTime + offSet;
Console.WriteLine(newDateTime);

这会产生以下输出:

29/07/2010 11:13:45

这是原始时间(2010 年 7 月 29 日 14:13:45)减去 3 小时(偏移量 - -03:00:00)。

请注意,此技术仅使用您的 DateTime 值执行简单的算术运算,不考虑任何时区。

【讨论】:

  • 请注意,当字符串中有“+”号时,解析会失败。所以使用'-'符号或根本没有符号! msdn.microsoft.com/en-us/library/se73z7b9%28v=vs.110%29.aspx
  • 夏令时怎么样?
  • @AnilPurswani 如果您知道特定的时区而不仅仅是“小时偏移”,您将只能应用夏令时偏移。 TimeZoneInfo 类有一个属性 (SupportsDaylightSavingTime) 来指示特定时区是否支持夏令时。不同的时区可能具有相同的小时偏移量,但可能支持也可能不支持夏令时。
【解决方案2】:

您可能遇到的问题是,大多数数据库驱动程序在从数据库中获取数据时会创建带有DateTimeKind.UnspecifiedDateTime,即使您使用ToUniversalTime,它也可能无法正确转换为UTC。为了解决这个问题,我使用了这样的扩展方法:

    public static DateTime ToSafeUniversalTime(this DateTime date) {
        if(date != DateTime.MinValue && date != DateTime.MaxValue) {
            switch(date.Kind) {
            case DateTimeKind.Unspecified:
                date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, DateTimeKind.Utc);
                break;
            case DateTimeKind.Local:
                date = date.ToUniversalTime();
                break;
            }
        }
        return date;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2015-05-11
    • 2021-06-02
    • 2022-06-27
    • 2020-05-01
    • 2012-08-02
    相关资源
    最近更新 更多