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/
希望能帮到你
~一位友好的程序员
我目前正在开发一个 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/
希望能帮到你
~一位友好的程序员