5

我尝试读取 csv 文件。我的第五条记录包含日期:03/11/2008

这是我的一段代码:

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

我的代码在此崩溃:

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

除了这个例外:行:1。列:41。字段:datum_5。将“2008 年 3 月 11 日”转换为类型时出错:“日期时间”。使用格式:'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 年 3 月 11 日开始确定日期 Parameternaam:从

我究竟做错了什么?

4

2 回答 2

5

它失败的原因是自定义日期格式字符串中的 / 是特定于文化的 DateSeparator ,如 MSDN 中所述

您正在nullIFormatProvider参数指定,因此它使用当前区域性,该区域性可能具有除 / 之外的日期分隔符。

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

// 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);
于 2010-11-16T17:39:13.930 回答
2

当您尝试时会发生什么:

DateTime.TryParseExact(from, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
于 2010-11-16T15:55:50.690 回答