使用CsvHelper.CsvWriter忽略日期格式的午夜

时间:2019-07-09 20:17:43

标签: csvhelper

默认情况下,CsvHelper.CsvWriter似乎在DateTime类型的日期字符串中输出午夜。我一直在尝试寻找一种在全球范围内解决此问题的好方法,因此我不必在每个领域都做到这一点。现在这就是我在做什么:

using System;
using CsvHelper;

namespace OsaDataManagement.Service.Extensions
{
    public static class CsvWriterExtensions
    {
        public static void SetDateFormat(this CsvWriter csv,
            string dateFormat = "MM/dd/yyyy")
        {
            csv.Configuration.TypeConverterOptionsCache
                .GetOptions<DateTime>().Formats = new[] { dateFormat };
            csv.Configuration.TypeConverterOptionsCache
                .GetOptions<DateTime?>().Formats = new[] { dateFormat };
        }
    }
}

但是,我想做的是能够检查日期以查看它是否具有时间值。如果没有,我将仅使用日期,否则将使用完整的日期/时间格式。不过,我看不到一种简单的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

CsvHelper使用标准的DateTime方法输出ToString(),除非您指定格式,例如在示例扩展方法中。指定格式的另一种方法是通过自定义转换器类,您可以在其中检查午夜并有条件地应用格式。

public class MidnightDateTimeConverter : DateTimeConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        if (value == null)
        {
            return base.ConvertToString(value, row, memberMapData);
        }

        var date = (DateTime)value;

        if (date.TimeOfDay.TotalSeconds == 0)
        {
            return date.ToString("MM/dd/yyyy");
        }

        return base.ConvertToString(value, row, memberMapData);
    }
}

然后可以按以下方式使用它。在我的测试中,它对DateTimeDateTime?都有效。

csv.Configuration.TypeConverterCache.AddConverter<DateTime>(new MidnightDateTimeConverter());