如何将所有 DateTime 字段写为 ISO 8601 字符串?

How to write all DateTime fields as ISO 8601 strings?

我正在用 IEnumerable<dynamic> 个对象编写 CSV。我不知道这些对象可以有多少个 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

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