我有一堆字符串是从某个数据库中转储的 DateTime 值......可能是 MySql。我无法控制结构。
字符串如下所示:
2011-05-17 00:00:00 等/格林威治标准时间
我找到了涉及在解析之前替换“Etc/GMT”的解决方案。这闻起来很糟糕。
是否有一个步骤解决方案可以将此字符串转换为 DateTime 而不会删除时区信息?
使用指定的格式和特定于区域性的格式信息将日期和时间的指定字符串表示形式转换为其等效的 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
根据对源的快速查看, Noda Time似乎包含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);
}
"Etc/GMT" 是一个tz aka Olson time zone specifier。这些几乎在任何地方都使用,除了 Windows,因为微软有自己的。
因此,.NET 中没有任何东西可以帮助您。你将不得不去其他地方。正如 user7116 提到的,Noda Time支持 tz 时区和Microsoft 时区。这是一个很棒的图书馆。
令人讨厌的是,.NET 实际上没有DateTime
附加时区的类型。它可以附加一个不完全相同的偏移量(一个时区可以有多个偏移量,具体取决于 DST)。Noda Time确实支持这一点,并将能够准确地保留该声明。