5

csvファイルを読み込もうとしています。私の5番目のレコードには日付が含まれています:2008年3月11日

これは私のコードの一部です:

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

私のコードはこれでクラッシュします:

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

そして、この例外を除いて:行:1。列:41。フィールド:datum_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年3月11日から日付を作成できませんParameternaam:から

私は何が間違っているのですか?

4

2 に答える 2

5

失敗する理由は、MSDNで説明されているように、カスタムの日付形式の文字列の/がカルチャ固有のDateSeparatorであるためです。

引数を指定nullしているIFormatProviderので、現在のカルチャを使用しています。現在のカルチャには、おそらく/以外の日付区切り文字があります。

最善の解決策は、CultureInfo.InvariantCulture(以下の2番目のバージョン)を明示的に指定することです。カスタム日付フォーマット文字列の「/」をエスケープして、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 に答える