代码之家  ›  专栏  ›  技术社区  ›  lgabryel

如何在csvhelper中用毫秒序列化datetime

  •  0
  • lgabryel  · 技术社区  · 5 年前

    我需要将带有datetime字段的对象序列化为带毫秒的csv。我该怎么做?

    我用以下代码编写csv:

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

    校验和是这个类的字典:

    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
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   lesscode    5 年前

    如果你用这个 CsvHelper ,似乎有一种方法可以将其配置为 ClassMap 以下内容:

    https://joshclose.github.io/CsvHelper/api/CsvHelper.Configuration

        2
  •  0
  •   lgabryel    5 年前

    谢谢,但我会根据这个主题制作自己的转换器 CsvHelper set default custom TypeConverter

    我做了一些小小的改变

        public class DateConverter : ITypeConverter
        {
            private readonly string _dateFormat;
    
            public DateConverter(string dateFormat)
            {
                _dateFormat = dateFormat;
            }
    
            public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
            {
                if (!string.IsNullOrEmpty(text))
                {
                    DateTime dt;
                    DateTime.TryParseExact(text, _dateFormat,
                                           CultureInfo.InvariantCulture,
                                           DateTimeStyles.None,
                                           out dt);
                    if (IsValidSqlDateTime(dt))
                    {
                        return dt;
                    }
    
                }
    
                return null;
            }
            public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
            {
                return ObjectToDateString(value, _dateFormat);
            }
    
            public string ObjectToDateString(object o, string dateFormat)
            {
                if (o == null) return string.Empty;
    
                DateTime dt;
                if (o is DateTime)
                {
                    dt = (DateTime)o;
                    return dt.ToString(dateFormat);
                }
                else
                    return string.Empty;
            }
            public bool IsValidSqlDateTime(DateTime? dateTime)
            {
                if (dateTime == null) return true;
    
                DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString());
                DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString());
    
                if (minValue > dateTime.Value || maxValue < dateTime.Value)
                    return false;
    
                return true;
            }
        }
    

    并使用:

    using (var writer = new StreamWriter(_checksumsFilePath))
                using (var csv = new CsvWriter(writer))
                {
                    csv.Configuration.TypeConverterCache.RemoveConverter<DateTime>();
                    csv.Configuration.TypeConverterCache.RemoveConverter<DateTime?>();
                    csv.Configuration.TypeConverterCache.AddConverter<DateTime?>(new DateConverter("MM/dd/yyyy hh:mm:ss.fff"));
                    csv.Configuration.TypeConverterCache.AddConverter<DateTime>(new DateConverter("MM/dd/yyyy hh:mm:ss.fff"));
                    csv.WriteRecords(_checksums.Values.ToList());
                }