【发布时间】:2017-10-12 08:06:48
【问题描述】:
我有一个具有 DateTime 类型属性的模型。从这个属性中,我想在写入 CSV 文件和通过 CsvHelper 从 CSV 文件读取时将秒和微秒包含到字符串中。
这就是我通过扩展 DefaultTypeConverter
提出解决方案的方法public class CsvDateTimeConverter : DefaultTypeConverter
{
private const string DateStringFormat = "MM/dd/yyyy HH:mm:ss.fff";
public override object ConvertFromString(TypeConverterOptions options, string text)
{
if (string.IsNullOrEmpty(text)) return null;
return Convert.ToDateTime(text);
}
public override string ConvertToString(TypeConverterOptions options, object value)
{
if (value == null) return "";
var dateTime = (DateTime) value;
return dateTime.ToString(DateStringFormat);
}
}
模型看起来像这样
public class MyModel
{
// ..... removed other properties
public DateTime MyDateTime {get; set};
}
CsvClassMapper 看起来像这样
public sealed class CsvMap : CsvClassMap<MyModel>
{
public CsvMap()
{
Map(m => m.MyDateTime).TypeConverter<CsvDateTimeConverter>();
}
}
我将类映射注册到阅读器和作者。但问题是:
我可以使用转换器成功写入 CSV 文件,但是当我尝试从 CSV 文件中读取时,它可以读取其他属性,但 DateTime 属性返回 null。
那么..我错过了什么?
已编辑:
如果有帮助:
这是从 csv 文件中读取的代码:
using (TextReader reader = new StreamReader(filePath))
{
var csv = new CsvReader(reader);
csv.Configuration.RegisterClassMap<CsvMap>();
csv.Configuration.Encoding = Encoding.UTF8;
return csv.GetRecords<MyModel>().ToList();
}
【问题讨论】:
-
用 DateTime.ParseExact() 替换 Convert.ToDateTime(text) 并使用格式:"MM/dd/yyyy HH:mm:ss.fff"
-
什么自定义日期时间转换器?这不会转换任何东西,它只是对
Convert.ToDateTime(text)的简单调用。这将使用当前语言环境的格式 -
CsvDateTimeConverter中的代码似乎工作正常(如果我直接调用它)。也许是转换器注册的问题?见C# Fiddle -
这是美国格式。您不需要为此使用自定义转换器。您是否尝试过通过
Configuration.CultureInfo设置文化? -
@ash 你不需要使用自定义类型转换器。您可以通过 TypeConverterOption 指定格式、文化等。 +1,因为如果不是这个问题,我也不会找到它