程序需要在列表中找到最小(或最大)的人。生日实际上是string
。我使用Convert.ToDateTime()
转换了日期,效果很好。但是,在少数情况下,输入仅为year
,而没有day
和month
,例如“ 1945”。转换器发生故障。
我的问题:
1)我可以添加什么检查器以防止此类运行时失败?
2)如何在不覆盖包含day
和month
的字符串的情况下将其转换为日期?
代码是:
DateTime curr_bday = Convert.ToDateTime(p.Birthday);
这是完整的例程:
public string the_youngest(Persons _p2)
{
DateTime youngAge = Convert.ToDateTime("01/01/1005");
DateTime curr_bday;
string to_ret = "";
foreach (var p in _p2.persons)
{
curr_bday = Convert.ToDateTime(p.Birthday);
if (curr_bday < youngAge)
{
youngAge = curr_bday;
to_ret = p.Name + " : " + p.Birthday;
}
}
return (to_ret);
}
答案 0 :(得分:1)
最好使用TryParse
:
DateTime bDay;
if (int.TryParse(dateString, out var birthYear))
{
dateString = new DateTime(birthYear, 7, 4); //born on the 4th of July
}
else if (!DateTime.TryParse( dateString, out bDay))
{
//let the user know there's a problem
}
答案 1 :(得分:0)
假设仅有两种可能的格式是{year}和{valid datetime}字符串,那么您可以做到
DateTime d;
if (p.Birthday.Length <= 4)
{
int year = int.Parse(p.Birthday);
d = new DateTime(year, 1, 1);
}
else
{
d = DateTime.Parse(p.Birthday)
}
这将再工作8000年。但是,如果还有其他特殊情况,则需要单独处理。
答案 2 :(得分:0)
探索TryParse
函数。它适用于日期,整数和小数。
DateTime birthdate;
if(DateTime.TryParse(p.Birthday, out birthdate))
{
//full date here successfully converted
//continue
}
else
{
birthdate = new DateTime(Int32.Parse(p.Birthday), 1, 1); //1 Jan by default
}