#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