【问题标题】:Convert a c# string with year only (sometimes) to datetime将仅包含年份的 c# 字符串(有时)转换为日期时间
【发布时间】:2019-08-12 16:24:12
【问题描述】:

程序需要在列表中找到最年轻(或最年长)的人。生日实际上是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);
} 

【问题讨论】:

  • 这些字符串是从哪里来的,你能给我们举几个例子吗?
  • int.TryParse测试字符串是否为整数。如果是,请使用仅指定年份的新构造的 DateTime 初始化您的生日变量。否则,将字符串解析为日期时间
  • 字符串来自解析器。这是给定的输入。
  • @ Flydog57 :看起来它运行良好。我在比较部分有一个错误(更大的生日意味着更年轻的人​​)谢谢!

标签: c# datetime type-conversion


【解决方案1】:

探索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
}

【讨论】:

    【解决方案2】:

    使用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
    }
    

    【讨论】:

    • 这里最稳定简洁的解决方案,点个赞! ;)
    【解决方案3】:

    假设只有两种可能的格式是 {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 年。但是,如果还有其他特殊情况,则需要单独处理。

    【讨论】:

    • 您最好在if 语句中使用int.TryParse。 “3/21”(今天)怎么样。它是四个字符,我相信它在美国的 Excel 副本中是一个有效日期
    猜你喜欢
    • 2021-10-16
    • 2023-04-09
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    相关资源
    最近更新 更多