DateTimeOffset.TryParse 在 Linux 中失败

DateTimeOffset.TryParse fails in 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) 但返回的布尔值仍然是 false 并且默认值 0001-01-01T00:00:00.0000000+00:00 被分配给 parsedDate.

有什么方法可以在 Linux 上执行此操作?

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) 示例对我来说很好)

在 Debian 上测试;

        DateTimeOffset parsedDate = new DateTimeOffset();
        if(DateTimeOffset.TryParse("29.10.2020".Replace(".", "/"), out parsedDate))
        {
            Console.WriteLine(parsedDate.ToString());
        }
        else
        {
            Console.WriteLine("Failed to parse");
        }

或如上建议

        DateTimeOffset parsedDate = new DateTimeOffset();
        if(DateTimeOffset.TryParseExact("29.10.2020", "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
        {
            Console.WriteLine(parsedDate.ToString());
        }
        else
        {
            Console.WriteLine("Failed to parse");
        }