我正在使用CsvHelper写一些CSV文件,并希望将我的日期和时间格式更改为特定格式。根据https://dev59.com/co3da4cB1Zd3GeqP4L4p#31817621中的建议,我可以成功地为我的每个类创建映射。
然而,这样做有一个明显的劣势,那就是现在我需要为要导出的所有类创建自定义映射。由于我始终希望导出所有字段,因此这变成了维护的噩梦,因为我必须每次修改映射。
那么,有没有简单的方法告诉CsvHelper使用特定格式写入所有日期和时间?
我正在使用CsvHelper写一些CSV文件,并希望将我的日期和时间格式更改为特定格式。根据https://dev59.com/co3da4cB1Zd3GeqP4L4p#31817621中的建议,我可以成功地为我的每个类创建映射。
然而,这样做有一个明显的劣势,那就是现在我需要为要导出的所有类创建自定义映射。由于我始终希望导出所有字段,因此这变成了维护的噩梦,因为我必须每次修改映射。
那么,有没有简单的方法告诉CsvHelper使用特定格式写入所有日期和时间?
使用更新版本(12.1.2)的CsvHelper,可以通过使用TypeConverterOptionsCache
实现。
var options = new TypeConverterOptions { Formats = new[] { "MM/dd/yyyy" } };
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
输出日期
08/24/1991
在版本20中,将TypeConverterOptionsCache
从Configuration
移到了Context
。因此上述内容变为:
var options = new TypeConverterOptions { Formats = new[] { "MM/dd/yyyy" } };
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime?>(options);
对我而言,使用CsvHelper类的属性更加容易。
[Format("yyyy-MM-dd")]
可以完成日期时间格式化的工作。
namespace BarNamespace
{
using System;
using CsvHelper.Configuration.Attributes;
public class Foo
{
[Name("ColumnName1")]
[Format("yyyy-MM-dd")]
public DateTime Date { get; set; }
[Name("ColumnName2")]
public string Col2{ get; set; }
[Name("ColumnName3")]
public long Col3{ get; set; }
}
}
您可以使用 TypeConverterOptionsFactory
全局地为每种类型进行设置。
void Main()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
using (var csv = new CsvWriter(writer))
{
var options = new TypeConverterOptions
{
Format = "o"
};
TypeConverterOptionsFactory.AddOptions<DateTime>(options);
csv.WriteField(DateTime.Now);
csv.NextRecord();
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
输出:
2016-09-19T11:01:41.5507054-05:00
DateTime
类型又有DateTime?
类型,请不要忘记同时注册这两种类型! - djeikyb