首页 > 解决方案 > 如何在 CsvHelper 中以毫秒为单位序列化 DateTime

问题描述

我想用毫秒将带有字段的对象序列化为DateTimecsv。我怎样才能做到这一点?

我正在用这段代码编写 csv:

using (var writer = new StreamWriter(_checksumsFilePath))
using (var csv = new CsvWriter(writer))
{
   csv.WriteRecords(_checksums.Values.ToList());
}

并且_checksums属于Dictionary这一类:

public class SomeClass
{
    public string Name { get; set; }

    public string val{ get; set; }

    public DateTime lastTime{ get; set; }
}

当我写时,我从调试器中看到 - 在 DateTime 中是几毫秒,但对于 csv 文件只写:

Name;val;lastTime
someName;49BC20DF15E412A64472421E13FE86FF1C5165E18B2AFCCF160D4DC19FE68A14;29.05.2019 16:13:08

标签: c#csvdatetime

解决方案


我通过使用基类的功能对您的答案进行了改进。假设您只编写 csv 文件,这应该可以解决问题。该类DefaultTypeConverter( GitHub ) 从memberMapData.TypeConverterOptions.Formats. 由于这个参数是为类中的所有转换器设置的CsvWriter,你可能不想要,你可以像我一样编辑这个函数,使用自定义格式。此函数现在不使用类中设置的格式CsvWriter,而是使用您自己的格式。

public class DateConverter : DateTimeConverter
{
    private readonly string dateFormat;

    /// <summary>
    /// Initializes a new instance of the <see cref="DateConverter"/> class.
    /// </summary>
    /// <param name="dateFormat">Format in which the data should be formatted.</param>
    public DateConverter(string dateFormat)
        : base()
    {
        this.dateFormat = dateFormat;
    }

    /// <inheritdoc/>
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        if (value == null)
        {
            if (memberMapData.TypeConverterOptions.NullValues.Count > 0)
            {
                return memberMapData.TypeConverterOptions.NullValues.First();
            }

            return string.Empty;
        }

        if (value is IFormattable formattable)
        {
            var format = this.dateFormat;
            return formattable.ToString(format, memberMapData.TypeConverterOptions.CultureInfo);
        }

        return value.ToString();
    }
}

推荐阅读