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

48

我正在使用CsvHelper写一些CSV文件,并希望将我的日期和时间格式更改为特定格式。根据https://dev59.com/co3da4cB1Zd3GeqP4L4p#31817621中的建议,我可以成功地为我的每个类创建映射。

然而,这样做有一个明显的劣势,那就是现在我需要为要导出的所有类创建自定义映射。由于我始终希望导出所有字段,因此这变成了维护的噩梦,因为我必须每次修改映射。

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

3个回答

73

使用更新版本(12.1.2)的CsvHelper,可以通过使用TypeConverterOptionsCache实现。

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

输出日期

08/24/1991

在版本20中,将TypeConverterOptionsCacheConfiguration移到了Context。因此上述内容变为:

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

18
如果你既有DateTime类型又有DateTime?类型,请不要忘记同时注册这两种类型! - djeikyb
1
在 Linux 上出现“error CS1545:不支持属性、索引器或事件 'CsvContext.TypeConverterOptionsCache';请尝试直接调用访问器方法 'CsvContext.get_TypeConverterOptionsCache()'或'CsvContext.set_TypeConverterOptionsCache(?)'”。 - devlord
1
对于 CsvHelper 26.0.1,这是正确的答案。 - Snympi

32

对我而言,使用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; }
    }
}


5
这是一种更易读的做事方式。 - Kyle J V

12

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

2
TypeConverterOptionsFactory在版本26.0.1中不再可见。 - Snympi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接