주어진 DateTime
표현하는 사람의 생일, 어떻게 몇 년 동안 자신의 나이를 계산합니까?
답변
이해하기 쉽고 간단한 솔루션.
// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate.Date > today.AddYears(-age)) age--;
그러나 이것은 당신이 동아시아의 계산법을 사용하지 않고 서구의 사상을 찾고 있다고 가정합니다 .
답변
이것은 이상한 방법이지만 날짜를 형식화하고 현재 yyyymmdd
날짜에서 생년월일을 빼면 마지막 4 자리를 버립니다. 🙂
C #을 모르지만 이것이 어떤 언어로도 작동한다고 생각합니다.
20080814 - 19800703 = 280111
마지막 4 자리 숫자 =를 버립니다 28
.
C # 코드 :
int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;
또는 확장 방법의 형태로 모든 유형 변환없이. 오류 검사 생략 :
public static Int32 GetAge(this DateTime dateOfBirth)
{
var today = DateTime.Today;
var a = (today.Year * 100 + today.Month) * 100 + today.Day;
var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;
return (a - b) / 10000;
}
답변
다음은 테스트 스 니펫입니다.
DateTime bDay = new DateTime(2000, 2, 29);
DateTime now = new DateTime(2009, 2, 28);
MessageBox.Show(string.Format("Test {0} {1} {2}",
CalculateAgeWrong1(bDay, now), // outputs 9
CalculateAgeWrong2(bDay, now), // outputs 9
CalculateAgeCorrect(bDay, now), // outputs 8
CalculateAgeCorrect2(bDay, now))); // outputs 8
여기에 방법이 있습니다.
public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}
public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
if (now < birthDate.AddYears(age))
age--;
return age;
}
public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
age--;
return age;
}
public int CalculateAgeCorrect2(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
// For leap years we need this
if (birthDate > now.AddYears(-age))
age--;
// Don't use:
// if (birthDate.AddYears(age) > now)
// age--;
return age;
}
답변
이에 대한 간단한 대답은 AddYears
아래에 표시된대로 적용하는 것입니다. 이것이 윤년의 2 월 29 일에 연도를 더하고 공통 연도의 2 월 28 일의 정확한 결과를 얻는 유일한 방법이기 때문입니다.
어떤 사람들은 3 월 1 일이 도약의 생일이라고 생각하지만 .Net이나 공식 규칙은 이것을 지원하지 않으며, 2 월에 태어난 일부 사람들이 다른 달에 생일의 75 %를 가져야하는 이유에 대한 일반적인 논리도 설명하지 않습니다.
또한 Age 메서드는에 확장으로 추가 될 수 있습니다 DateTime
. 이를 통해 가장 간단한 방법으로 나이를 얻을 수 있습니다.
- 아이템 목록
int age = birthDate.Age ();
public static class DateTimeExtensions
{
/// <summary>
/// Calculates the age in years of the current System.DateTime object today.
/// </summary>
/// <param name="birthDate">The date of birth</param>
/// <returns>Age in years today. 0 is returned for a future date of birth.</returns>
public static int Age(this DateTime birthDate)
{
return Age(birthDate, DateTime.Today);
}
/// <summary>
/// Calculates the age in years of the current System.DateTime object on a later date.
/// </summary>
/// <param name="birthDate">The date of birth</param>
/// <param name="laterDate">The date on which to calculate the age.</param>
/// <returns>Age in years on a later day. 0 is returned as minimum.</returns>
public static int Age(this DateTime birthDate, DateTime laterDate)
{
int age;
age = laterDate.Year - birthDate.Year;
if (age > 0)
{
age -= Convert.ToInt32(laterDate.Date < birthDate.Date.AddYears(age));
}
else
{
age = 0;
}
return age;
}
}
이제이 테스트를 실행하십시오.
class Program
{
static void Main(string[] args)
{
RunTest();
}
private static void RunTest()
{
DateTime birthDate = new DateTime(2000, 2, 28);
DateTime laterDate = new DateTime(2011, 2, 27);
string iso = "yyyy-MM-dd";
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.WriteLine("Birth date: " + birthDate.AddDays(i).ToString(iso) + " Later date: " + laterDate.AddDays(j).ToString(iso) + " Age: " + birthDate.AddDays(i).Age(laterDate.AddDays(j)).ToString());
}
}
Console.ReadKey();
}
}
중요한 날짜 예는 다음과 같습니다.
생년월일 : 2000-02-29 후기 : 2011-02-28 나이 : 11
산출:
{
Birth date: 2000-02-28 Later date: 2011-02-27 Age: 10
Birth date: 2000-02-28 Later date: 2011-02-28 Age: 11
Birth date: 2000-02-28 Later date: 2011-03-01 Age: 11
Birth date: 2000-02-29 Later date: 2011-02-27 Age: 10
Birth date: 2000-02-29 Later date: 2011-02-28 Age: 11
Birth date: 2000-02-29 Later date: 2011-03-01 Age: 11
Birth date: 2000-03-01 Later date: 2011-02-27 Age: 10
Birth date: 2000-03-01 Later date: 2011-02-28 Age: 10
Birth date: 2000-03-01 Later date: 2011-03-01 Age: 11
}
그리고 나중에 2012-02-28 :
{
Birth date: 2000-02-28 Later date: 2012-02-28 Age: 12
Birth date: 2000-02-28 Later date: 2012-02-29 Age: 12
Birth date: 2000-02-28 Later date: 2012-03-01 Age: 12
Birth date: 2000-02-29 Later date: 2012-02-28 Age: 11
Birth date: 2000-02-29 Later date: 2012-02-29 Age: 12
Birth date: 2000-02-29 Later date: 2012-03-01 Age: 12
Birth date: 2000-03-01 Later date: 2012-02-28 Age: 11
Birth date: 2000-03-01 Later date: 2012-02-29 Age: 11
Birth date: 2000-03-01 Later date: 2012-03-01 Age: 12
}
답변
나의 제안
int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);
그것은 올바른 날짜에 연도가 바뀌는 것 같습니다. (107 세까지 검사를 받았습니다.)
답변
나에 의한 것이 아니라 웹에서 발견 된 또 다른 기능은 조금 수정했습니다.
public static int GetAge(DateTime birthDate)
{
DateTime n = DateTime.Now; // To avoid a race condition around midnight
int age = n.Year - birthDate.Year;
if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
age--;
return age;
}
내 생각에 떠오른 두 가지 : 그레고리력을 사용하지 않는 국가의 사람들은 어떻습니까? DateTime.Now는 내가 생각하는 서버 특정 문화에 있습니다. 나는 실제로 아시아 달력을 사용하는 것에 대한 지식이 전혀 없으며 달력 사이의 날짜를 쉽게 변환하는 방법이 있는지 모르겠지만 4660 년의 중국인에 대해 궁금해하는 경우를 대비하여 🙂
답변
해결해야 할 2 가지 주요 문제는 다음과 같습니다.
1. 정확한 연령 -년, 월, 일 등을 계산하십시오 .
2. 일반적으로 인식되는 나이 계산 -사람들은 일반적으로 정확히 몇 살인지 상관하지 않고, 현재 연도의 생일 일 때만 걱정합니다.
1 에 대한 해결책 은 분명합니다.
DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today; //we usually don't care about birth time
TimeSpan age = today - birth; //.NET FCL should guarantee this as precise
double ageInDays = age.TotalDays; //total number of days ... also precise
double daysInYear = 365.2425; //statistical value for 400 years
double ageInYears = ageInDays / daysInYear; //can be shifted ... not so precise
2 에 대한 해결책은 총 연령을 결정하는 데 그렇게 정확하지 않지만 사람들이 정확하게 인식하는 것입니다. 사람들은 일반적으로 나이를 “수동으로”계산할 때 사용합니다.
DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;
int age = today.Year - birth.Year; //people perceive their age in years
if (today.Month < birth.Month ||
((today.Month == birth.Month) && (today.Day < birth.Day)))
{
age--; //birthday in current year not yet reached, we are 1 year younger ;)
//+ no birthday for 29.2. guys ... sorry, just wrong date for birth
}
2에 대한 참고 사항 ::
- 이것은 내가 선호하는 솔루션입니다
- DateTime.DayOfYear 또는 TimeSpans는 윤년의 일 수를 이동하므로 사용할 수 없습니다.
- 가독성을 위해 줄을 조금 더 넣었습니다.
한 가지 더 참고하십시오 … 나는 그것을 위해 두 가지 정적 오버로드 된 메소드를 만들 것입니다. 하나는 보편적 인 사용법을위한 것이고 다른 하나는 사용법 친화적 인 것입니다.
public static int GetAge(DateTime bithDay, DateTime today)
{
//chosen solution method body
}
public static int GetAge(DateTime birthDay)
{
return GetAge(birthDay, DateTime.Now);
}