CsvHelper изменяет способ вывода даты и времени

Я использую CsvHelper для записи некоторых файлов CSV и хочу изменить формат моих дат и времени на что-то специфический. Следуя совету https://stackoverflow.com/a/31817621/223742, я могу успешно создавать карты для каждого из моих классы.

Однако у него есть явный недостаток: теперь мне нужно создавать собственные карты для всех классов, которые я хочу экспортировать. Поскольку я всегда хочу, чтобы все поля экспортировались, это становится кошмаром обслуживания, поскольку мне каждый раз приходится вносить поправки в карты.

Так есть ли простой способ указать CsvHelper писать все даты и время в определенном формате?


person TheEdge    schedule 19.09.2016    source источник


Ответы (2)


Вы можете установить его глобально для каждого типа, используя 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
person Josh Close    schedule 19.09.2016
comment
TypeConverterOptionsFactory больше не отображается в версии 26.0.1 - person Snympi; 05.03.2021

В более новой версии (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);
person Pylyp Lebediev    schedule 23.08.2019
comment
и если у вас есть смесь DateTime и DateTime?, не забудьте зарегистрировать оба типа! - person djeikyb; 10.10.2019
comment
Получение error CS1545: Property, indexer, or event 'CsvContext.TypeConverterOptionsCache' is not supported by the language; try directly calling accessor methods 'CsvContext.get_TypeConverterOptionsCache()' or 'CsvContext.set_TypeConverterOptionsCache(?)' в Linux. - person devlord; 05.02.2021
comment
Для CsvHelper 26.0.1 это правильный ответ. - person Snympi; 05.03.2021
comment
Хотел бы я вставать больше одного раза .... - person Giannis Paraskevopoulos; 16.04.2021