c# - new - vb format date




C#으로 누군가의 나이를 어떻게 계산합니까? (20)

SQL 버전 :

declare @dd smalldatetime = '1980-04-01'
declare @age int = YEAR(GETDATE())-YEAR(@dd)
if (@dd> DATEADD(YYYY, -@age, GETDATE())) set @age = @age -1

print @age  

사람의 생일을 나타내는 DateTime 주어지면 몇 년 동안의 나이를 어떻게 계산합니까?


그것을 (그리고 어리석은 어쩌면 :) 간단하게 유지).

DateTime birth = new DateTime(1975, 09, 27, 01, 00, 00, 00);
TimeSpan ts = DateTime.Now - birth;
Console.WriteLine("You are approximately " + ts.TotalSeconds.ToString() + " seconds old.");

나이를 계산하는 맞춤식 메소드와 보너스 유효성 확인 메시지가 있습니다.

public void GetAge(DateTime dob, DateTime now, out int years, out int months, out int days)
{
    years = 0;
    months = 0;
    days = 0;

    DateTime tmpdob = new DateTime(dob.Year, dob.Month, 1);
    DateTime tmpnow = new DateTime(now.Year, now.Month, 1);

    while (tmpdob.AddYears(years).AddMonths(months) < tmpnow)
    {
        months++;
        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (now.Day >= dob.Day)
        days = days + now.Day - dob.Day;
    else
    {
        months--;
        if (months < 0)
        {
            years--;
            months = months + 12;
        }
        days += DateTime.DaysInMonth(now.AddMonths(-1).Year, now.AddMonths(-1).Month) + now.Day - dob.Day;
    }

    if (DateTime.IsLeapYear(dob.Year) && dob.Month == 2 && dob.Day == 29 && now >= new DateTime(now.Year, 3, 1))
        days++;

}   

private string ValidateDate(DateTime dob) //This method will validate the date
{
    int Years = 0; int Months = 0; int Days = 0;

    GetAge(dob, DateTime.Now, out Years, out Months, out Days);

    if (Years < 18)
        message =  Years + " is too young. Please try again on your 18th birthday.";
    else if (Years >= 65)
        message = Years + " is too old. Date of Birth must not be 65 or older.";
    else
        return null; //Denotes validation passed
}

메서드를 호출하고 datetime 값을 전달합니다 (서버가 미국 로케일로 설정된 경우 MM / dd / yyyy). 이것을 messagebox 또는 표시 할 컨테이너로 바꿉니다.

DateTime dob = DateTime.Parse("03/10/1982");  

string message = ValidateDate(dob);

lbldatemessage.Visible = !StringIsNullOrWhitespace(message);
lbldatemessage.Text = message ?? ""; //Ternary if message is null then default to empty string

원하는 방식으로 메시지 서식을 지정할 수 있습니다.


내가 찾은 가장 간단한 방법은 이것이다. 그것은 미국과 서부 유럽 로케일에서 올바르게 작동합니다. 다른 지역, 특히 중국과 같은 장소에는 말을 할 수 없습니다. 4 여분은, 나이의 처음 계산 다음에 많아야, 비교한다.

public int AgeInYears(DateTime birthDate, DateTime referenceDate)
{
  Debug.Assert(referenceDate >= birthDate, 
               "birth date must be on or prior to the reference date");

  DateTime birth = birthDate.Date;
  DateTime reference = referenceDate.Date;
  int years = (reference.Year - birth.Year);

  //
  // an offset of -1 is applied if the birth date has 
  // not yet occurred in the current year.
  //
  if (reference.Month > birth.Month);
  else if (reference.Month < birth.Month) 
    --years;
  else // in birth month
  {
    if (reference.Day < birth.Day)
      --years;
  }

  return years ;
}

나는 이것에 대한 답을 찾아 보았고 아무도 도약일의 출생에 대한 규제 / 법적 함의를 언급하지 않았다는 사실에 주목했다. 예를 들어, 위키 피 디아 (Wikipedia)에 따르면, 2 월 29 일에 여러 지역에서 출생 한 경우 윤년이 아닌 윤년입니다.

  • 영국과 홍콩에서는 다음 해 인 3 월 1 일이 생일입니다.
  • 뉴질랜드에서는 운전 면허증 발급을위한 전날 인 2 월 28 일과 다른 목적으로는 3 월 1 일입니다.
  • 대만 : 2 월 28 일입니다.

그리고 제가 말할 수있는 것처럼, 법령은이 문제에 관해 침묵을 지키며, 관습법과 다양한 규제 기관이 규정에서 어떤 것을 규정하는지에 관해서는 침묵합니다.

그 목적을 위해 개선 사항 :

public enum LeapDayRule
{
  OrdinalDay     = 1 ,
  LastDayOfMonth = 2 ,
}

static int ComputeAgeInYears(DateTime birth, DateTime reference, LeapYearBirthdayRule ruleInEffect)
{
  bool isLeapYearBirthday = CultureInfo.CurrentCulture.Calendar.IsLeapDay(birth.Year, birth.Month, birth.Day);
  DateTime cutoff;

  if (isLeapYearBirthday && !DateTime.IsLeapYear(reference.Year))
  {
    switch (ruleInEffect)
    {
      case LeapDayRule.OrdinalDay:
        cutoff = new DateTime(reference.Year, 1, 1)
                             .AddDays(birth.DayOfYear - 1);
        break;

      case LeapDayRule.LastDayOfMonth:
        cutoff = new DateTime(reference.Year, birth.Month, 1)
                             .AddMonths(1)
                             .AddDays(-1);
        break;

      default:
        throw new InvalidOperationException();
    }
  }
  else
  {
    cutoff = new DateTime(reference.Year, birth.Month, birth.Day);
  }

  int age = (reference.Year - birth.Year) + (reference >= cutoff ? 0 : -1);
  return age < 0 ? 0 : age;
}

이 코드는 다음을 전제로합니다.

  • 서부 (유럽) 시대의 계산
  • 월말에 단일 윤년을 삽입하는 그레고리력과 같은 달력입니다.

여기에 해결책이 있습니다.

DateTime dateOfBirth = new DateTime(2000, 4, 18);
DateTime currentDate = DateTime.Now;

int ageInYears = 0;
int ageInMonths = 0;
int ageInDays = 0;

ageInDays = currentDate.Day - dateOfBirth.Day;
ageInMonths = currentDate.Month - dateOfBirth.Month;
ageInYears = currentDate.Year - dateOfBirth.Year;

if (ageInDays < 0)
{
    ageInDays += DateTime.DaysInMonth(currentDate.Year, currentDate.Month);
    ageInMonths = ageInMonths--;

    if (ageInMonths < 0)
    {
        ageInMonths += 12;
        ageInYears--;
    }
}

if (ageInMonths < 0)
{
    ageInMonths += 12;
    ageInYears--;
}

Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);

이 고전적인 질문은 Noda Time 솔루션의 가치가 있습니다.

static int GetAge(LocalDate dateOfBirth)
{
    Instant now = SystemClock.Instance.Now;

    // The target time zone is important.
    // It should align with the *current physical location* of the person
    // you are talking about.  When the whereabouts of that person are unknown,
    // then you use the time zone of the person who is *asking* for the age.
    // The time zone of birth is irrelevant!

    DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/New_York"];

    LocalDate today = now.InZone(zone).Date;

    Period period = Period.Between(dateOfBirth, today, PeriodUnits.Years);

    return (int) period.Years;
}

용법:

LocalDate dateOfBirth = new LocalDate(1976, 8, 27);
int age = GetAge(dateOfBirth);

다음과 같은 개선 사항에 관심이있을 수도 있습니다.

  • 시계 IClock 대신을 사용 SystemClock.Instance 하면 테스트 가능성이 향상됩니다.

  • 대상 시간대가 변경 될 수 있으므로 DateTimeZone 매개 변수도 필요합니다.

이 주제에 대한 내 블로그 게시물 : 생일 및 기타 기념일 다루기


이것은 2 월 29 일의 생일을 2 월 28 일의 어떤 연도와 비교해도 가장 정확한 답 중 하나입니다.

public int GetAge(DateTime birthDate)
{
    int age = DateTime.Now.Year - birthDate.Year;

    if (birthDate.DayOfYear > DateTime.Now.DayOfYear)
        age--;

    return age;
}

이것은 직접적인 대답은 아니지만, 준 과학적 입장에서 볼 때의 문제에 대한 철학적 추론에 더 가깝습니다.

나는 그 질문이 나이를 측정하는 단위 나 문화를 명시하지 않고 있다고 주장 할 것이다. 대부분의 해답은 정수 연감을 가정하는 것으로 보인다. 시간에 대한 SI 단위 second 는 정확한 일반 응답이 있어야한다. (물론 정규화 된 것으로 가정 DateTime 하고 상대 론적 효과에 대해서는 전혀 고려하지 않는다.)

var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor;

기독교 시대의 나이를 계산할 때 :

var then = ... // Then, in this case the birthday
var now = DateTime.UtcNow;
int age = now.Year - then.Year;
if (now.AddYears(-age) < then) age--;

금융 분야에서는 종종 특정 기간 동안의 수년 인 일수 계산법 ( Day Count Fraction) 이라고도하는 것을 계산할 때 비슷한 문제가 있습니다. 그리고 나이 문제는 실제로 시간을 측정하는 문제입니다.

실제 / 실제 (예 : "올바르게"계산) 규칙의 예 :

DateTime start, end = .... // Whatever, assume start is before end

double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365);
double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365);
double middleContribution = (double) (end.Year - start.Year - 1);

double DCF = startYearContribution + endYearContribution + middleContribution;

시간을 측정하는 또 다른 꽤 일반적인 방법은 일반적으로 "연재"(이 날짜 대회를 지명 한 친구는 진지하게 trippin '이었습니다)입니다.

DateTime start, end = .... // Whatever, assume start is before end
int days = (end - start).Days;

나는 상대주의 시대가 몇 초 만에 시작되기 전에 얼마나 오래 갈지 궁금해한다. 지구 생명체의 대략적인 근사값보다 훨씬 더 유용하다. 자신을위한 동작을 나타내는 함수는 유효합니다 :)


나 이외의 다른 기능은 웹에서 찾았지만 조금 세련되었습니다.

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 월 29 일 문제에 대해 테스트하고 도약 년과 그것이 작동하는 것, 나는 어떤 의견을 주시면 감사하겠습니다 :

public void LoopAge(DateTime myDOB, DateTime FutureDate)
{
    int years = 0;
    int months = 0;
    int days = 0;

    DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);

    DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);

    while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
    {
        months++;

        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (FutureDate.Day >= myDOB.Day)
    {
        days = days + FutureDate.Day - myDOB.Day;
    }
    else
    {
        months--;

        if (months < 0)
        {
            years--;
            months = months + 12;
        }

        days +=
            DateTime.DaysInMonth(
                FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month
            ) + FutureDate.Day - myDOB.Day;

    }

    //add an extra day if the dob is a leap day
    if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
    {
        //but only if the future date is less than 1st March
        if (FutureDate >= new DateTime(FutureDate.Year, 3, 1))
            days++;
    }

}

나는 자신의 생년월일을 기준으로 누군가의 나이를 계산하기 위해 SQL Server User Defined Function을 만들었습니다. 이는 쿼리의 일부로 필요할 때 유용합니다.

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlInt32 CalculateAge(string strBirthDate)
    {
        DateTime dtBirthDate = new DateTime();
        dtBirthDate = Convert.ToDateTime(strBirthDate);
        DateTime dtToday = DateTime.Now;

        // get the difference in years
        int years = dtToday.Year - dtBirthDate.Year;

        // subtract another year if we're before the
        // birth day in the current year
        if (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month && dtToday.Day < dtBirthDate.Day))
            years=years-1;

        int intCustomerAge = years;
        return intCustomerAge;
    }
};

나는 잘못된 해결책이 어떻게 받아 들여질 수 있는지 모른다. 올바른 C # 스 니펫은 Michael Stum이 썼습니다.

다음은 테스트 스 니펫입니다.

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

나는 파티에 늦었지만, 여기에 하나의 라이너가있다 :

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;

나의 제안

int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);

바로 그 날이 바뀌는 해가있는 것 같습니다. (나는 107 세까지 테스트를 받았다)


우리는 1 년 미만의 사람들을 고려해야합니까? 중국 문화로서, 우리는 2 개월 또는 4 주로 작은 아기의 나이를 설명합니다.

아래는 제 구현입니다. 상상 한 것만 큼 간단하지는 않습니다. 특히 2/28과 같은 날짜를 다루는 것이 좋습니다.

public static string HowOld(DateTime birthday, DateTime now)
{
    if (now < birthday)
        throw new ArgumentOutOfRangeException("birthday must be less than now.");

    TimeSpan diff = now - birthday;
    int diffDays = (int)diff.TotalDays;

    if (diffDays > 7)//year, month and week
    {
        int age = now.Year - birthday.Year;

        if (birthday > now.AddYears(-age))
            age--;

        if (age > 0)
        {
            return age + (age > 1 ? " years" : " year");
        }
        else
        {// month and week
            DateTime d = birthday;
            int diffMonth = 1;

            while (d.AddMonths(diffMonth) <= now)
            {
                diffMonth++;
            }

            age = diffMonth-1;

            if (age == 1 && d.Day > now.Day)
                age--;

            if (age > 0)
            {
                return age + (age > 1 ? " months" : " month");
            }
            else
            {
                age = diffDays / 7;
                return age + (age > 1 ? " weeks" : " week");
            }
        }
    }
    else if (diffDays > 0)
    {
        int age = diffDays;
        return age + (age > 1 ? " days" : " day");
    }
    else
    {
        int age = diffDays;
        return "just born";
    }
}

이 구현은 테스트 케이스 아래를 통과했습니다.

[TestMethod]
public void TestAge()
{
    string age = HowOld(new DateTime(2011, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2011, 11, 30), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2001, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("11 years", age);

    age = HowOld(new DateTime(2012, 1, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("10 months", age);

    age = HowOld(new DateTime(2011, 12, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("11 months", age);

    age = HowOld(new DateTime(2012, 10, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2008, 2, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("11 months", age);

    age = HowOld(new DateTime(2008, 3, 28), new DateTime(2009, 3, 28));
    Assert.AreEqual("1 year", age);

    age = HowOld(new DateTime(2009, 1, 28), new DateTime(2009, 2, 28));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));
    Assert.AreEqual("1 month", age);

    // NOTE.
    // new DateTime(2008, 1, 31).AddMonths(1) == new DateTime(2009, 2, 28);
    // new DateTime(2008, 1, 28).AddMonths(1) == new DateTime(2009, 2, 28);
    age = HowOld(new DateTime(2009, 1, 31), new DateTime(2009, 2, 28));
    Assert.AreEqual("4 weeks", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 2, 28));
    Assert.AreEqual("3 weeks", age);

    age = HowOld(new DateTime(2009, 2, 1), new DateTime(2009, 3, 1));
    Assert.AreEqual("1 month", age);

    age = HowOld(new DateTime(2012, 11, 5), new DateTime(2012, 11, 30));
    Assert.AreEqual("3 weeks", age);

    age = HowOld(new DateTime(2012, 11, 1), new DateTime(2012, 11, 30));
    Assert.AreEqual("4 weeks", age);

    age = HowOld(new DateTime(2012, 11, 20), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 week", age);

    age = HowOld(new DateTime(2012, 11, 25), new DateTime(2012, 11, 30));
    Assert.AreEqual("5 days", age);

    age = HowOld(new DateTime(2012, 11, 29), new DateTime(2012, 11, 30));
    Assert.AreEqual("1 day", age);

    age = HowOld(new DateTime(2012, 11, 30), new DateTime(2012, 11, 30));
    Assert.AreEqual("just born", age);

    age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 2, 28));
    Assert.AreEqual("8 years", age);

    age = HowOld(new DateTime(2000, 2, 29), new DateTime(2009, 3, 1));
    Assert.AreEqual("9 years", age);

    Exception e = null;

    try
    {
        age = HowOld(new DateTime(2012, 12, 1), new DateTime(2012, 11, 30));
    }
    catch (ArgumentOutOfRangeException ex)
    {
        e = ex;
    }

    Assert.IsTrue(e != null);
}

희망이 도움이됩니다.


윤년과 모든 것이 있기 때문에 내가 아는 가장 좋은 방법은 다음과 같습니다.

DateTime birthDate = new DateTime(2000,3,1);
int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D);

희망이 도움이됩니다.


이것은 이상한 방법이지만 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 birth = new DateTime(1974, 8, 29);
DateTime today = DateTime.Now;
TimeSpan span = today - birth;
DateTime age = DateTime.MinValue + span;

// Make adjustment due to MinValue equalling 1/1/1
int years = age.Year - 1;
int months = age.Month - 1;
int days = age.Day - 1;

// Print out not only how many years old they are but give months and days as well
Console.Write("{0} years, {1} months, {2} days", years, months, days);

이해하기 쉽고 간단한 솔루션입니다.

// 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--;

그러나 이것은 당신이 나이에 대한 서구의 생각을 찾고 동아시아 계산법을 사용하지 않고 있다고 가정합니다.


private int GetAge(int _year, int _month, int _day
{
    DateTime yourBirthDate= new DateTime(_year, _month, _day);

    DateTime todaysDateTime = DateTime.Today;
    int noOfYears = todaysDateTime.Year - yourBirthDate.Year;

    if (DateTime.Now.Month < yourBirthDate.Month ||
        (DateTime.Now.Month == yourBirthDate.Month && DateTime.Now.Day < yourBirthDate.Day))
    {
        noOfYears--;
    }

    return  noOfYears;
}






datetime