如何在不丢失TZ信息的情况下解析此DateTime?

时间:2013-09-18 20:13:42

标签: c# parsing datetime

我有一堆字符串是从某些数据库中转储的DateTime值...可能是MySql。我无法控制结构。

字符串看起来像这样:

  

2011-05-17 00:00:00 Etc / GMT

我发现解决方案涉及在解析之前替换“Etc / GMT”。这闻起来很糟糕。

是否有一步解决方案将此字符串转换为DateTime而不删除时区信息?

3 个答案:

答案 0 :(得分:4)

DateTime.ParseExact

  

使用指定的格式和特定​​于文化的格式信息,将指定的日期和时间字符串表示形式转换为其DateTime等效形式。字符串表示的格式必须与指定的格式完全匹配。

对于时髦的格式,您可以使用ParseExact。您也可能想使用DateTimeStyles.AssumeUniversal

String original = "2011-05-17 00:00:00 Etc/GMT";
DateTime result = DateTime.ParseExact(
    original,
    "yyyy-MM-dd HH:mm:ss 'Etc/GMT'",
    System.Globalization.CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal);
Console.WriteLine(result.ToString()); // given my timezone: 5/16/2011 8:00:00 PM
Console.WriteLine(result.ToUniversalTime().ToString()); // 5/17/2011 12:00:00 AM

答案 1 :(得分:4)

基于对来源的快速查看,Noda Time time zone database中的{{3}}似乎包含Etc/GMT

解析日期和时间的方法在Noda Time中与在.Net Framework中有所不同(我绝不是Noda Time的专家):

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    @"yyyy'-'MM'-'dd HH':'mm':'ss z",
    DateTimeZoneProviders.Tzdb);

var result = pattern.Parse(@"2011-05-17 00:00:00 Etc/GMT");
if (result.Success)
{
    Console.WriteLine("{0}", result.Value);
}

答案 2 :(得分:2)

“Etc / GMT”是tz aka Olson time zone specifier。除了Windows之外,它们几乎无处不在,因为微软拥有自己的。

因此,.NET中没有任何内容可以帮助您。你必须去其他地方。正如user7116所提到的,Noda Time支持tz时区 Microsoft时区。这是一个很棒的图书馆。

令人讨厌的是,.NET实际上没有附加时区的DateTime类型。它可以附加一个偏移,它不完全相同(时区可以有多个偏移,具体取决于DST)。 Noda Time 支持此功能,并且能够完全保留该语句。