Как записать все поля DateTime в виде строк ISO 8601? - PullRequest
1 голос
/ 01 мая 2020

Я пишу CSV из IEnumerable<dynamic> объектов. Я не знаю, сколько полей DateTime могут иметь эти объекты, ни их имен.

Есть ли способ указать CsvWriter записать все объекты DateTime в виде строк ISO 8601?

var records = new List<dynamic>();

dynamic record = new ExpandoObject();
record.Timestamp = DateTime.UtcNow;
records.Add(record);

using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(records);
    writer.ToString().Dump(); // I want the DateTime to be in ISO 8601 format (2020-05-01T15:29:19Z)
}

https://dotnetfiddle.net/1ng5W9

1 Ответ

1 голос
/ 01 мая 2020

Вы можете использовать TypeConverterOptions и применить параметры к DateTime.

using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    var options = new TypeConverterOptions { Formats = new [] {"s"} };
    //apply options to datetime
    csv.Configuration.TypeConverterOptionsCache.AddOptions<DateTime>(options);

    csv.WriteRecords(records);
    writer.ToString().Dump();
}

// output
// 2020-05-01T16:02:36

При этом используется "s" (сортируемый формат даты и времени).
Вы можете применить любой формат, какой пожелаете, для пример: Formats = new [] { "yyyy-MM-ddTHH:mm:ss" } даст аналогичный результат.

См. обновленный demo .

...