我目前正在开发一个dotnet core 3.0应用程序,该应用程序需要将不同的datetime字符串解析为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上正确解析这些DateTime?
更新:
我刚刚注意到日期的年份部分丢失了。这是该例外的原因吗?但是为什么它可以在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")
使用其他格式>