【问题标题】:DateTimeOffset.TryParse fails in LinuxDateTimeOffset.TryParse 在 Linux 中失败
【发布时间】:2020-11-02 12:03:18
【问题描述】:

我正在尝试使用 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 上有什么方法可以做到这一点?

【问题讨论】:

  • 你的错误信息是什么?
  • 你的运行时间是多少? Mono 还是 .NET Core?
  • 使用DateTime.TryParse(...)不是更好吗?
  • “失败”是什么意思?您收到错误消息吗?如果有,那是什么?你得到错误的值吗?如果有,那是什么?如果你只有一个日期,为什么还要使用DateTimeOffset

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 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");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多