FieldConverter ConverterKind.Date" DD / MM / YYYY"例外 [英] FieldConverter ConverterKind.Date "dd/MM/yyyy" exception

查看:280
本文介绍了FieldConverter ConverterKind.Date" DD / MM / YYYY"例外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试读取csv文件。
我的第五个记录contans日期:2008年3月11日

I try to read a csv file. my fifth record contans a date: 03/11/2008

这是一段我的代码:

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

在此我的代码crashs:

My code crashs on this:

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

和与此异常:
线:1列:41现场:datum_5。错误转换'03 / 11/2008'的键入:日期时间。使用格式:'DD / MM / YYYY

And with this exception: Line: 1. Column: 41. Field: datum_5. Error Converting '03/11/2008' to type: 'DateTime'. Using the format: 'dd/MM/yyyy'

当我这样做:

[FieldConverter(typeof(ConvertDate))]

        public DateTime datum_5;



与此:

with this:

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日期:从

I got this exception: can not make a date from 03/11/2008 Parameternaam: from

我究竟做错了

推荐答案

它的失败的原因是,/在一个自定义日期格式字符串的特定文化DateSeparator在MSDN 描述。

The reason it's failing is that / in a custom date format string is a culture-specific DateSeparator as described in MSDN.

您指定的IFormatProvider 参数,所以它使用目前的文化,这大概比/.

You are specifying null for the IFormatProvider argument, so it's using the current culture, which presumably has a date separator other than /.

最好的办法是明确指定CultureInfo.InvariantCulture(下图2版)。逃离'/'在您的自定义日期格式的字符串,使其作为文字斜杠,而不是DateSeparator也将工作(下一个版本)进行处理。

The best solution is to explicitly specify CultureInfo.InvariantCulture (second version below). Escaping the '/' in your custom date format string so that it is treated as a literal slash rather than a DateSeparator will also work (first version below).

// 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);

这篇关于FieldConverter ConverterKind.Date&QUOT; DD / MM / YYYY&QUOT;例外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆