mee*_*ans 5 .net c# csv filehelpers datetime
我尝试读取csv文件.我的第五个记录是一个日期:03/11/2008
这是我的一段代码:
[FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
public DateTime datum_5;
Run Code Online (Sandbox Code Playgroud)
我的代码崩溃了:
Result[] results= (Result[])engine.ReadFile(@"..\Data\expo.txt");
Run Code Online (Sandbox Code Playgroud)
并且有以下例外:行:1.列:41.字段:datum_5.错误将'03/11/2008'转换为类型:'DateTime'.使用格式:'dd/MM/yyyy'
当我这样做:
[FieldConverter(typeof(ConvertDate))]
public DateTime datum_5;
Run Code Online (Sandbox Code Playgroud)
有了这个:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外:无法约定03/11/2008 Parameternaam:from
我究竟做错了什么?
它失败的原因是/在自定义日期格式字符串中是文化特定的DateSeparator,如MSDN中所述.
您正在null为IFormatProvider参数指定,因此它使用当前文化,该文化可能具有除/之外的日期分隔符.
最佳解决方案是明确指定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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3464 次 |
| 最近记录: |