Я смотрел, чтобы сериализовать объект с полем DateTime в CSV с миллисекундами. Как я могу это сделать?

Я пишу CSV по этому коду:

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

И _checksums - это словарь этого класса:

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
0
lgabryel 29 Май 2019 в 17:26

2 ответа

Лучший ответ

Спасибо, но я делаю свой собственный конвертер из этой темы CsvHelper устанавливает по умолчанию пользовательский 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());
            }
0
lgabryel 29 Май 2019 в 17:48

Если вы используете этот CsvHelper, похоже, существует способ его настройки с ClassMap:

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

0
lesscode 29 Май 2019 в 14:35
56362889