默认情况下,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 };
}
}
}
但是,我想做的是能够检查日期以查看它是否具有时间值。如果没有,我将仅使用日期,否则将使用完整的日期/时间格式。不过,我看不到一种简单的方法。有什么建议吗?
答案 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);
}
}
然后可以按以下方式使用它。在我的测试中,它对DateTime
和DateTime?
都有效。
csv.Configuration.TypeConverterCache.AddConverter<DateTime>(new MidnightDateTimeConverter());