首页 > 解决方案 > DateTimeOffset.TryParse 在 Linux 中失败

问题描述

我正在尝试使用 解析字符串DateTimeOffset.TryParse,它在 Windows 上成功但在 Linux 上失败:

DateTimeOffset.TryParse("29.10.2020", out var parsedDate);

我也尝试使用解析它

DateTimeOffset.TryParseExact("29.10.2020", "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate)但返回的 bool 仍然是false并且默认值0001-01-01T00:00:00.0000000+00:00被分配为parsedDate.

有什么办法可以在 Linux 上做到这一点?

标签: c#.net-core.net-5

解决方案


这种TryParse使用当前文化(CultureInfo.CurrentCulture)的重载,因此您的开发机器(Windows)和您的 linux 机器之间的文化是不同的。例如:

CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en");
DateTimeOffset parsedDate;
bool res = DateTimeOffset.TryParse("29.10.2020", out parsedDate);
Console.WriteLine(res); // false
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("ru");
res = DateTimeOffset.TryParse("29.10.2020", out parsedDate);
Console.WriteLine(res); // true

因此,您需要使用重载来接受IFormatProvider并在那里传递提供程序,这对于您存储日期的格式是有意义的。例如:

var cultureOfMyDates = CultureInfo.GetCultureInfo("ru");
res = DateTimeOffset.TryParse("29.10.2020", cultureOfMyDates, DateTimeStyles.None, out parsedDate);

或使用TryParseExact(您的样品DateTimeOffset.TryParseExact("29.10.2020", "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate)对我来说很好)


推荐阅读