c# - 如何在 CsvHelper 中以毫秒为单位序列化 DateTime
问题描述
我想用毫秒将带有字段的对象序列化为DateTime
csv。我怎样才能做到这一点?
我正在用这段代码编写 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
解决方案
我通过使用基类的功能对您的答案进行了改进。假设您只编写 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();
}
}
推荐阅读
- r - Visual Studio Code 中的自动完成功能:R 中的列名
- html - :在尊重父母的填充之前
- swift - Swift 在协议中使用泛型
- ruby-on-rails - Rails Digest::UUID v5 (vs) Postgresql uuid-ossp v5
- node.js - 需要从 ~ 中删除 package.json 并有一个干净的终端负载
- ios - “iPhone 拒绝了发布请求。” 无法调试
- c++ - 可以提升 vf2 处理这种情况的多图吗?
- mysql - MySQL中MyISAM表中一个字段的varchar长度扩展有什么作用?
- python-3.x - 导入 CSV - 将数据从字典写入文件 - 错误
- python - 我无法通过双击执行 .pyw 文件