我正在编写一个小程序,它接收CSV文件并将它们更新到数据库。其中一个文件有一个date-of-birth
列,该列的格式并不总是相同。
我已经开始编写代码来检查整个列表以确定格式,因为单个日期可能不明确(例如'10 / 12/12','10 / 12/2012','12/10/2012' ,'2012/12/10'都可以是相同的日期)。我假设格式对于给定列表是一致的。
这是我到目前为止的代码,
private static string GetDateFormat(string[] date)
{
DateTime result;
CultureInfo ci = CultureInfo.InvariantCulture;
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
bool error;
date = date.Where(x => !string.IsNullOrEmpty(x)).ToArray();
foreach (string a in fmts)
{
error = false;
for (int i = 0; i < date.Count(); i++)
{
if (!DateTime.TryParseExact(date[i], a, ci, DateTimeStyles.AssumeLocal, out result))
{
error = true;
}
}
if (error == false)
{
return a;
}
}
throw new CsvToImsException("Error: Date Format is inconsistant or unrecognised");
}
但是由于每个列表中的小问题(一个列表的日期设置为'4/5/2012'
而不是'04/05/2012'
,我无法使用我的任何样本日期) '4/05/2012 0:00'
等。)
这一定是个常见问题。有没有人为这个应用程序编写了足够广泛的库?我正在考虑用'/'
字符拆分日期进行解析,但有更简单的方法吗?
答案 0 :(得分:1)
这些东西可以帮助您走上正确的道路,找到您需要的东西 请阅读示例代码中的注释,因为如果日期包含单月值和单日值,则只需添加2条条件if语句
//of course you will not hard code the dates you will replace DateString with your
//Date Variable you can also convert the code below into a method if you so
string DateString = "04/05/2012";
var dateLength = DateString.Length;
IFormatProvider culture = new CultureInfo("en-US", true);
DateTime dateVal;
switch (dateLength)
{
case 8:
{
dateVal = DateTime.ParseExact(DateString, "M/d/yyyy", culture);
break;
}
case 9:
{
// he you can add your own additional if(){} condition to check if date value Day has a length of 2
// if so then you know that the date is in m/dd/yyyy format
// otherwise you know it's in mm/d/yyyy but
dateVal = DateTime.ParseExact(DateString, "M/dd/yyyy", culture);
break;
}
case 10:
{
dateVal = DateTime.ParseExact(DateString, "MM/dd/yyyy", culture);
break;
}
}
答案 1 :(得分:0)
我最终使用的方法类似于我原来的方法,并添加了DJ KRAZE代码中的一些内容。除了4/05/2012 0:00
之类的奇怪之外,这适用于所有人,但即便如此,也可以通过添加fmts.Add("d/MM/yyyy h:mm")
行的特殊情况来解决。
//Parse DOB to check format
string[] dateList = new string[PersonList.Count()];
for (int i = 0; i < PersonList.Count(); i++)
{
PersonList[i].DOB = PersonList[i].DOB.Replace('-', '/').Replace('.', '/').Trim();
dateList[i] = PersonList[i].DOB;
}
string dateFormat = GetDateFormat(dateList);
private static string GetDateFormat(string[] date)
{
DateTime result;
CultureInfo ci = CultureInfo.InvariantCulture;
List<string> fmts = ci.DateTimeFormat.GetAllDateTimePatterns().ToList();
fmts.Add("yyyy/MM/d");
fmts.Add("d/MM/yyyy");
bool error;
date = date.Where(x => !string.IsNullOrEmpty(x)).ToArray();
foreach (string a in fmts)
{
error = false;
for (int i = 0; i < date.Count(); i++)
{
if (!DateTime.TryParseExact(date[i], a, ci, DateTimeStyles.AssumeLocal, out result))
{
error = true;
}
}
if (error == false)
{
return a;
}
}
throw new CsvToImsException("Error: Date Format is inconsistant or unrecognised");
}
然后我可以在for循环中使用日期格式来解析列表中的每个日期:
IFormatProvider culture = new CultureInfo("en-US", true);
BirthDate birthDate = DateTime.ParseExact(person.DOB, dateFormat, culture);