我正在使用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);
}
}
但我还是得到了上面的异常。
我该如何解决这个问题,以便能够解析给定的日期时间?
1条答案
按热度按时间zrfyljdw1#
您指定了错误的日期格式字符串:
或
您提供的示例和错误消息不匹配,因此在此示例中,我为两者提供了Map!
h
仅适用于12小时值,因此小于或等于12,因此对于14之类的值将溢出。如果没有提供am/pm指示符(tt
),则 * 所有 * 小时值都将解释为am
,因此只能将h
与tt
一起使用。H
(单个H
)是解析个位数小时值所必需的,但它也会匹配两位数小时,并将其正确解释为24小时时间。只有在你想要 * 强制 * 一个前导零输出或者当你 * 知道 * 输入将 * 总是 * 有一个前导零的情况下,才使用双小时字符(
hh
/HH
)。* 对于解析输入,我们将始终使用单小时指示符 *,因为它适用于单小时,前导零和两位数的小时输入。您只需要更改
FormatAttribute
中的格式表达式:阅读有关C#Custom Date and Time Format Strings的更多信息
你可以在这里看到一个证明:https://dotnetfiddle.net/orIGv9