CsvHelper库无法解析日期时间

kxxlusnw  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在使用CsvHelper库将CSV文件解析为对象列表。
我已经将datetime格式作为yyyy-MM-dd hh:mm:ss t添加到类中,但在解析时出现错误。日期的格式如下:

public class Claim
{
    [Name("Name")]
    public string Name{ get; set; }
    [Name("Number")]
    public string Number{ get; set; }
    [Name("Date")]
    [Format("dd/MM/yyyy","yyyy-MM-dd hh:mm")]
    public DateTime Date{ get; set; }
}

下面我将使用CsvHelper库解析CSV文件

using (var streamReader = new StreamReader(filePath))
        {
            using (var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture))
            {
                var claims = csvReader.GetRecords<Claim>().ToList();
                return claims;
            }
        }

以下是

2022-04-19 12:00:00 AM

示例CSV:

Name,Number,Date
XTC,2545454545,2022-04-19 0:00
JCF,7878421215,2022-01-20 0:00

我得到以下异常:
未处理的异常。CsvHelper.TypeConversion.TypeConverterException:无法执行转换。
文本:'2022-04-19 12:00:00 AM'
会员名称:日期
MemberType:System.DateTime
类型转换器:' CsvHelper.TypeConversion.DateTimeConverter '
我尝试了以下解决方案:

var options = new TypeConverterOptions { Formats = new[] { "dd/MM/yyyy" } };
 csvReader.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);

以及:

csvReader.Context.RegisterClassMap<CsvMap>()

public sealed class CsvMap : CsvHelper.Configuration.ClassMap<Claim>
    {
        public CsvMap()
        {
            const string format = "dd/MM/yyyy";
            var culture= CultureInfo.GetCultureInfo("en-US");
    
            Map(m => m.Date).TypeConverterOption.Format(format)
                .TypeConverterOption.CultureInfo(culture);
        }
    }

但我还是得到了上面的异常。
我该如何解决这个问题,以便能够解析给定的日期时间?

zrfyljdw

zrfyljdw1#

您指定了错误的日期格式字符串:

2022-04-19 0:00
yyyy-MM-dd H:mm

2022-04-19 12:00:00 AM
yyyy-MM-dd h:mm:ss tt

您提供的示例和错误消息不匹配,因此在此示例中,我为两者提供了Map!

  • h仅适用于12小时值,因此小于或等于12,因此对于14之类的值将溢出。如果没有提供am/pm指示符(tt),则 * 所有 * 小时值都将解释为am,因此只能将htt一起使用。
  • H(单个H)是解析个位数小时值所必需的,但它也会匹配两位数小时,并将其正确解释为24小时时间。

只有在你想要 * 强制 * 一个前导零输出或者当你 * 知道 * 输入将 * 总是 * 有一个前导零的情况下,才使用双小时字符(hh/HH)。* 对于解析输入,我们将始终使用单小时指示符 *,因为它适用于单小时,前导零和两位数的小时输入。
您只需要更改FormatAttribute中的格式表达式:
阅读有关C#Custom Date and Time Format Strings的更多信息

[Format("dd/MM/yyyy", "yyyy-MM-dd H:mm", "yyyy-MM-dd h:mm:ss tt")] 
public DateTime Date{ get; set; }

你可以在这里看到一个证明:https://dotnetfiddle.net/orIGv9

相关问题