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

spe*_*der 3 c# datetime parsing

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

字符串如下所示:

2011-05-17 00:00:00 等/格林威治标准时间

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

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

Bra*_*tie 5

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
Run Code Online (Sandbox Code Playgroud)

  • 我没有机会操纵这个字符串。它在一个(真的真的)巨大的数据库转储中,我对格式的控制为零。我知道 ParseExact。我不知道如何让它以这种格式解析时区信息。 (2认同)
  • 如果采用这种方法,您可能永远不应该让它使用您当地的时区。您可以通过`DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal`,或者您可以让它解析为“未指定”,然后应用“DateTime.SpecifyKind(dt, DateTimeKind.Utc)”。 (2认同)