DateTime.ParseExact 使用自定义日期格式:适用于 windows 但不适用于 raspbian

DateTime.ParseExact with custom date formats: works on windows but not on raspbian

我目前正在开发一个 dotnet core 3.0 应用程序,它需要将不同的日期时间字符串解析为 System.DateTime。我的开发环境是 Windows 10 上的 VS2019,但稍后应用程序将在 Raspbian (debian-arm) 上 运行。 让我们看看这个示例代码:

// input string
const string testdate = "Jan. 1 01:05:26";

var dateFormats = new[] { "MMM. d HH:mm:ss", "MMM. dd HH:mm:ss" };

var dateTime = DateTime.ParseExact(testdate, dateFormats, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal);

// output should be: 01.01.2020 01:05:26
Console.WriteLine($"Date: {dateTime.ToString("dd.MM.yyyy HH:mm:ss")}");

虽然这在 windows 10 下的开发中按预期工作,但它会在 raspbian:

上抛出异常
System.FormatException: String 'Jan. 1 01:05:26' was not recognized as a valid DateTime.

我已经检查了 CultureInfo,但两个系统都设置为同一个。我在这里缺少什么吗?我如何确保在 raspbian 上正确解析这些日期时间?

更新:

我刚刚注意到日期中的年份部分丢失了。这是那个例外的原因吗?但为什么它在 windows 上工作并假设当前年份?

解法:

正如 nl-x 所建议的,我尝试将当前日期时间打印为我的输入日期格式。那里是:

DateTime.Now.ToString("MMM. d HH:mm:ss")
// Windows output: Jan. 2 16:29:45
// Raspbian output: Jan.. 2 16:29:45

显然 raspbian 已经包含 "MMM" 格式的尾随点,而 windows 没有。将我的日期格式更改为:

var dateFormats = new[] { "MMM. d HH:mm:ss", "MMM. dd HH:mm:ss", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" };

现在可以在 windows 和 linux 中使用。谢谢!

尝试使用固定区域性,或明确设置区域性。

您的本地系统可能 运行 使用与 Linux 系统不同的语言。

您本地系统上的 "Jan" 可能与 Linux 系统上的不同。

尝试使用 linux 中的当前格式打印日期,看看它是否使用其他格式 "Jan" EG dateTime.Now.ToString("MMM. d HH:mm:ss", "MMM. dd HH:mm:ss")

您的代码 运行 遇到的问题是 windows 和 linux 以不同的方式显示日期时间。您已经通过使用 var[] dateFormats 解决了这个问题。然后作为下一个参数,你传递了 CultureInfo.CurrentCulture 如果我做对了,它会采用你的 dateFormats 的可变性。看着 .NET 论坛,我真的不知道为什么不变文化在这一点上不起作用。我建议您实现一个方法 "parseLinux(var dateTime)",以及一个布尔值 parseToLinux,您在程序开始时根据程序 运行 所在的平台将其设置为 true 或 false。该函数采用 windows 格式,通过 .Split() 您现在可以自己 "Hardcode" 格式差异。设置日期时间后,您可以像这样调用函数

dateTime = parseToLinux(dateTime).

如果您将此函数调用保留在 if 语句中,您的程序应该再次变得灵活和独立。我知道这不是你想要解决问题的方式,但现在看来手动更改排列是最简单的。

一些看起来很有前途的网页: https://blogs.msdn.microsoft.com/mikekelly/2009/01/17/unix-time-and-windows-time/

https://social.msdn.microsoft.com/Forums/en-US/55dd74ed-6538-44a1-a843-0b7000c312f4/how-to-convert-windows-date-time-to-unix-date-time?forum=netfxbcl

希望能帮到你

~一位友好的程序员