代码之家  ›  专栏  ›  技术社区  ›  Ron Owens

需要解析到目前为止的7位字符串

  •  -3
  • Ron Owens  · 技术社区  · 2 年前

    我正在做一个项目,需要将平面文件中的数据导入数据库。我的问题是,有些日期解析不正确。例如:1977110(yyyyMdd)。

    string dateString = "1977110";
    DateTime date = DateTime.ParseExact(dateString, "yyyyMd", null); 
    Console.WriteLine(date.ToString("MM/dd/yyyy"));
    

    这将引发一个异常:未处理的异常。

    系统FormatException:字符串“”未被识别为有效的 日期时间。在系统中。日期时间。ParseExact(字符串s,字符串格式, IFormatProvider提供程序)

    我希望将“1977110”字符串解析为MM/dd/yyyy的日期格式

    1 回复  |  直到 2 年前
        1
  •  2
  •   Soner Gönül to StackOverflow    2 年前

    这是中解析操作的经典“更宽形式”情况。NET。

    这里发生了什么;

    1977 可以用解析 yyyy specifier 这很好, M custom format specifier 是的 1 到 12 ,这就是为什么需要 11 不 只是 1. 作为“更广泛的形式”规则。但只有 0 留在你的绳子上 不能 使用解析 d custom format specifier 因为它的范围是从 1. 到 31 。这就是为什么你会得到例外。

    我伸手去够。NET Framework团队过去也遇到过同样的问题,他们的回应是 use the wider range form in your string or insert separator 。在这两种情况下,你 不得不 操作字符串以解决这种歧义。

    作为一个小建议,我不会使用 null 作为 IFormatProvider 在解析操作中,因为当您使用null时 CurrentCulture 使用了您正在运行的代码和 可以 随着时间的推移很容易改变。这就是为什么最好指定 CultureInfo 在您的代码中。

    作为对您的最后建议 date.ToString("MM/dd/yyyy") 部分 / custom specifier 作为一种特殊的含义作为“ 替换我提供的培养基日期分隔符的当前培养基 ”“既然你没有提供 IFormatProvider 作为中的第二个参数 ToString 方法,您的 CurrentCulture s DateSeparator 可能是 不同于 / 这个代码打印那个字符,而不是 / 。想想看。