CsvHelper 更改日期和时间的输出方式

CsvHelper changing how dates and times are output

我正在使用 CsvHelper to write some CSV files and want to change the format of my dates and times to something specific. Following the advice from 我可以成功地为我的每个 类 创建地图。

然而,它有一个明显的缺点,即我现在需要为我想要导出的所有 类 创建自定义地图。因为我总是希望导出所有字段,所以这成为维护的噩梦,因为我每次都必须修改地图。

那么有什么简单的方法可以告诉 CsvHelper 使用特定格式写入所有日期和时间

您可以使用 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

使用较新版本(12.1.2)的CsvHelper,可以使用TypeConverterOptionsCache

进行存档
var options = new TypeConverterOptions { Formats = new[] { "MM/dd/yyyy" } };
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);

输出日期

08/24/1991

版本 20 从 Configuration 移动 TypeConverterOptionsCacheContext。所以上面变成了

var options = new TypeConverterOptions { Formats = new[] { "MM/dd/yyyy" } };
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
csvWriter.Context.TypeConverterOptionsCache.AddOptions<DateTime?>(options);

对我来说,在 class 上使用 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; }
    }
}