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");
}
我正在尝试使用 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");
}