将仅具有年份的C#字符串(有时)转换为日期时间

时间:2019-03-21 18:13:59

标签: c# datetime type-conversion

程序需要在列表中找到最小(或最大)的人。生日实际上是string。我使用Convert.ToDateTime()转换了日期,效果很好。但是,在少数情况下,输入仅为year,而没有daymonth,例如“ 1945”。转换器发生故障。

我的问题:

1)我可以添加什么检查器以防止此类运行时失败?

2)如何在不覆盖包含daymonth的字符串的情况下将其转换为日期? 代码是:

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);
} 

3 个答案:

答案 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
}