代码之家  ›  专栏  ›  技术社区  ›  meersmans

FieldConverter ConverterKind.Date“dd/mm/yyyy”异常

  •  5
  • meersmans  · 技术社区  · 14 年前

    我试着读一个csv文件。 我的第五个记录包含一个日期:2008年11月3日

    这是我的代码:

        [FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
        public DateTime datum_5;
    

    我的代码会崩溃:

    Result[] results= (Result[])engine.ReadFile(@"..\Data\expo.txt");
    

    除此之外: 行:1。列:41。场:基准面5。将“03/11/2008”转换为类型“datetime”时出错。使用格式:“dd/mm/yyyy”

    当我这样做的时候:

    [FieldConverter(typeof(ConvertDate))]
    
            public DateTime datum_5;
    

    有了这个:

    internal class ConvertDate : ConverterBase
       {
    
           /// <summary>
           /// different forms for date separator : . or / or space
           /// </summary>
           /// <param name="from">the string format of date - first the day</param>
           /// <returns></returns>
    
           public override object StringToField(string from)
           {
               DateTime dt;
    
               if (DateTime.TryParseExact(from, "dd.MM.yyyy", null, DateTimeStyles.None, out dt))
                   return dt;
    
               if (DateTime.TryParseExact(from, "dd/MM/yyyy", null, DateTimeStyles.None, out dt))
                   return dt;
    
               if (DateTime.TryParseExact(from, "dd MM yyyy", null, DateTimeStyles.None, out dt))
                   return dt;
    
               throw new ArgumentException("can not make a date from " + from, "from");
    
           }
       }
    

    我有个例外:不能从2008年11月3日开始约会 参数名称:来自

    我做错什么了?

    3 回复  |  直到 14 年前
        1
  •  5
  •   to StackOverflow    14 年前

    失败的原因是/在自定义日期格式字符串中 a culture-specific DateSeparator as described in MSDN .

    您正在指定 null 对于 IFormatProvider 参数,所以它使用的是当前区域性,它可能有一个除/之外的日期分隔符。

    最好的解决方案是显式指定CultureInfo.InvariantCulture(下面的第二个版本)。在自定义日期格式字符串中转义“/”,以便将其视为文本斜杠而不是日期分隔符,也可以工作(下面的第一个版本)。

    // Set current culture to a culture that uses "." as DateSeparator
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    // This will work - escaping means it uses a literal / as the separator
    DateTime.TryParseExact(s, @"dd\/MM\/yyyy", null, DateTimeStyles.None, out result);
    
    // This is better - Culture.InvariantCulture uses / for the DateTimeFormatInfo.DateSeparator
    // and you clearly express the intent to use the invariant culture
    DateTime.TryParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
    
    // This will fail - / means use DateTimeFormatInfo.DateSeparator which is "." in the de-DE culture
    DateTime.TryParseExact(s, "dd/MM/yyyy", null, DateTimeStyles.None, out result);
    
        2
  •  2
  •   Roman Marusyk S Kotra    8 年前

    当你尝试时会发生什么:

    DateTime.TryParseExact(from, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
    
        3
  •  0
  •   Phoenix Rex    10 年前

    如果写:

    [FieldConverter(ConverterKind.Date, "dd'/'MM'/'yyyy")]
    public DateTime datum_5;