如何在 C# 中解析默认 git 日期格式

How to parse default git date format in C#

如何在 C# 中将默认 git 格式解析为 DateTime? 根据 What is the format for --date parameter of git commit

git 的默认日期格式类似于 Mon Jul 3 17:18:43 2006 +0200

现在我无法控制输出,这个字符串来自另一个打印日期的工具,我需要解析它。

到目前为止我找到的最佳格式字符串是 ddd MMM d HH:mm:ss yyyy K.

DateTime date;
DateTime.TryParseExact(
    gitDateString,
    "ddd MMM d HH:mm:ss yyyy K",
    System.Globalization.CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.None,
    out date
);

我不会将其解析为 DateTime,我会将其解析为其中的 DateTimeOffset since it has a UTC offset 值。

为什么?因为如果你将它解析为 DateTime,你将得到一个 DateTime 作为 Local 并且它 可能 为不同的机器生成不同的结果,因为它们 可以那个时间的时区偏移量。

例如,我在 Istanbul and we use Eastern European Time 中使用 UTC+02:00。如果我 运行 使用 ParseExact 方法的代码示例,我将得到 07/03/2006 18:18:43 作为 Local 时间。

为什么?因为在 2006 年 7 月 3 日,my timezone was in a daylight saving time 即 UTC+03:00。这就是它生成 1 小时转发结果的原因。当您将它解析为 DateTime.

时,这就是它变得模棱两可的部分
string s = "Mon Jul 3 17:18:43 2006 +0200";
DateTimeOffset dto;
if (DateTimeOffset.TryParseExact(s, "ddd MMM d HH:mm:ss yyyy K", 
                                 CultureInfo.InvariantCulture,
                                 DateTimeStyles.None, out dto))
{
    Console.WriteLine(dto);
}

现在,您有一个 DateTimeOffset 作为 07/03/2006 17:18:43 +02:00。您仍然可以获得 DateTime 部分,在这种情况下,.DateTime property but it's Kind 将是 Unspecified

当然,我建议改用Noda Time,这样可以解决大部分日期时间问题。