Преобразуйте строку c #, содержащую только год (иногда), в datetime

#c# #datetime #type-conversion

#c# #datetime #преобразование типа

Вопрос:

Программе необходимо найти самого молодого (или старейшего) пользователя в списке. День рождения на самом деле является string . Я преобразовал даты, используя Convert.ToDateTime() , который работает нормально. Однако в некоторых случаях вводится просто year , без day и month , например, «1945». Происходит сбой конвертера.

Мои вопросы:

1) какую проверку я могу добавить, чтобы предотвратить такой сбой во время выполнения?

2) Как я могу преобразовать ее в date, не переопределяя строки, которые включают day и month the? код является:

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

Комментарии:

1. Откуда берутся эти строки, и можете ли вы привести нам несколько примеров?

2. Проверьте, является ли строка целым числом с int.TryParse . Если это так, инициализируйте свою переменную birthday с помощью недавно созданного DateTime, где вы указываете только год. В противном случае проанализируйте строку как дату и время

3. Строки поступают из синтаксического анализатора. Это заданный ввод.

4. @ Flydog57 : похоже, что это работает хорошо. У меня была ошибка в части сравнения (более крупный день рождения означает более молодого человека) Спасибо!

Ответ №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 all over:

 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. здесь самое стабильное и краткое решение, проголосуйте за! 😉

Ответ №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 лет. Однако, если есть другие особые случаи, вам нужно обработать их отдельно.

Комментарии:

1. Вам лучше использовать int.TryParse в if инструкции. Как насчет «3/21» (сегодня). Это четыре символа, и я полагаю, что это была бы допустимая дата в американской копии Excel