Member 12823969 Ответов: 5

Ошибка в datetime nullable


Привет,

У меня есть nullable Datetime, и я не могу вычислить возраст. Пожалуйста помочь.
public static int GetPersonAge(DateTime? birthDay, DateTime endDate)
{
    int years = endDate.Year - birthDay.Year;

    if (birthDay.Month > endDate.Month || (birthDay.Month == endDate.Month && 
      birthDay.Day > endDate.Day))
      years--;
            
      return years;
}


Спасибо

Что я уже пробовал:

StackOverflow, форум MSD

5 Ответов

Рейтинг:
2

Thomas Daniels

birthDay это Nullable<DateTime>, так что у него нет .Year, .Month, прием. Значение nullable - если оно вообще существует - имеет значение. Поэтому либо измените свой метод, чтобы принять DateTime, а не nullable, либо извлеките birthDay значение перед его использованием (если есть значение - вы можете проверить это с помощью .HasValue Если нет никакой ценности, делайте все, что хотите).


Рейтинг:
2

F-ES Sitecore

Воспользуйся

birthDay.Value.Year


скорее, чем

birthDay.Year


То же самое с месяцем и т. д. Ваш код также должен обрабатывать, когда день рождения равен нулю, поэтому вам нужно решить, что произойдет в этом сценарии. Вы можете использовать

if (!birthDay.HasValue)
{
    // ....
}


проверять.


Рейтинг:
2

Anurag Gandhi

В идеале, вы должны вернуть значение null int, чтобы обрабатывать значения null дата рождения.
Верните null, если день рождения равен null, потому что в этом случае вы не можете вычислить возраст.

public static int? GetPersonAge(DateTime? birthDay, DateTime endDate)
	{
		if(birthDay.HasValue)
		{
			int years = endDate.Year - birthDay.Value.Year;

			if (birthDay.Value.Month > endDate.Month || (birthDay.Value.Month == endDate.Month && birthDay.Value.Day > endDate.Day))
		  		years--;

		  	return years;
		}
		return null;		
	}


Рейтинг:
0

OriginalGriff

В дополнение к использованию свойств HasValue и Value, которые были предложены, вы можете найти это полезным: Работа с возрастом: это не то же самое, что промежуток времени![^]


Рейтинг:
0

Benktesh Sharma

Подобно приведенным выше решениям, сначала проверьте, является ли день рождения нулевым, а затем получите доступ к значению, а затем к году/месяцу/Дню.

public static int GetPersonAge(DateTime? birthDay, DateTime endDate)
        {

            if (birthDay == null)
            {
                throw new ArgumentNullException($"Cannot calculate Age"); 
            }
            
            int years = endDate.Year - birthDay.Value.Year;

            if (birthDay.Value.Month > endDate.Month || (birthDay.Value.Month == endDate.Month &&
                                                   birthDay.Value.Day > endDate.Day))
                years--;

            return years;
        }