将UTC时间和偏移量转换为DateTime

5

我在数据库中保存了一个UTC时间,并且我知道偏移量的格式如下。

-03:00:00

如何将此转换为DateTime

1
“12:12:12” 对我来说看起来不像是一个UTC偏移量,也不是一个日期时间字段。您能详细说明每个部分的含义吗? - Oded
2
这篇文章可以帮助你:https://dev59.com/_HE85IYBdhLWcg3w6oB0 - Aykut Çevik
@Oded 这是UTC偏移量,其范围为-12:00:00至13:00:00。 - developer
2个回答

17

将“偏移量”应用于您已经拥有的 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值执行简单的算术运算,不考虑任何时区。


2
请注意,当字符串中包含“+”符号时,解析会失败。因此,请使用“-”符号或根本不使用符号!http://msdn.microsoft.com/en-us/library/se73z7b9%28v=vs.110%29.aspx - Jowen
夏令时怎么办? - Anil Purswani
@AnilPurswani 如果你只知道“小时偏移量”,而不知道具体的时区,那么你只能应用夏令时偏移量。TimeZoneInfo 类有一个属性(SupportsDaylightSavingTime),用于指示特定时区是否支持夏令时。不同的时区可能具有相同的小时偏移量,但可能支持或不支持夏令时。 - CraigTP

0
您可能遇到的问题是,大多数 DB 驱动程序在从数据库获取数据时都会创建具有 DateTimeKind.Unspecified 的 DateTime。即使使用 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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接