2010-02-03 89 views
15

thể trùng lặp:
How do I calculate someone’s age in C#?Cách tính tuổi dựa trên ngày sinh?

Tôi muốn viết một phương pháp helper ASP.NET mà trả về tuổi của một người nào đó sinh nhật của mình.

Tôi đã thử mã như thế này:

public static string Age(this HtmlHelper helper, DateTime birthday) 
{ 
    return (DateTime.Now - birthday); //?? 
} 

Nhưng nó không làm việc. Cách chính xác để tính tuổi của người đó dựa trên ngày sinh của họ là gì?

Trả lời

38

Stackoverflow sử dụng chức năng như vậy để xác định tuổi của người dùng.

Calculate age in C#

Câu trả lời được đưa ra là

DateTime now = DateTime.Today; 
int age = now.Year - bday.Year; 
if (now < bday.AddYears(age)) age--; 

Vì vậy, phương pháp helper của bạn sẽ trông như thế

public static string Age(this HtmlHelper helper, DateTime birthday) 
{ 
    DateTime now = DateTime.Today; 
    int age = now.Year - birthday.Year; 
    if (now < birthday.AddYears(age)) age--; 

    return age.ToString(); 
} 

Hôm nay, tôi sử dụng một phiên bản khác của chức năng này để bao gồm một ngày tham khảo . Điều này cho phép tôi để có được tuổi của một ai đó vào một ngày trong tương lai hoặc trong quá khứ. Điều này được sử dụng cho hệ thống đặt chỗ của chúng tôi, nơi cần có tuổi trong tương lai.

public static int GetAge(DateTime reference, DateTime birthday) 
{ 
    int age = reference.Year - birthday.Year; 
    if (reference < birthday.AddYears(age)) age--; 

    return age; 
} 
+0

Tại sao không chỉ 'DateTime mới (DateTime.Now.Subtract (birthDate.Ticks) .Year - 1'? –

+0

Một lưu ý phụ, hành vi đúng cho ngày sinh trong tương lai là gì? Trả về một số âm? người theo nghĩa đen sinh ngày hôm qua có tuổi 0 năm? –

+0

@Steven Người nào đó chưa sinh ra phải luôn có độ tuổi là 0, imo. Bạn chỉ có 1 năm vào cuối năm đó. Chúng tôi tổ chức sự thay đổi trong ngày, nhưng năm 2000 đã hoàn thành chỉ vào đầu năm 2001, vì vậy chúng ta nên ăn mừng năm 2000 vào đầu năm 2001 không phải vào đầu năm 2000. –

-2

Tôi thực sự không hiểu tại sao bạn sẽ làm cho Trình trợ giúp HTML này. Tôi sẽ biến nó thành một phần của từ điển ViewData trong một phương thức hành động của bộ điều khiển. Một cái gì đó như thế này:

ViewData["Age"] = DateTime.Now.Year - birthday.Year; 

Cho sinh nhật đó được chuyển thành phương pháp hành động và là đối tượng DateTime.

+2

doesn 't làm việc nếu ai đó được sinh ra trong ' '2009-12-31''; trong ''2010-01-01'' đã có một năm? –

+0

Như đã nói, điều này luôn đúng nếu người đó được sinh vào ngày đầu tiên của tháng Giêng. Trong bất kỳ trường hợp nào khác, sẽ có những ngày mà kết quả sai nếu ngày/tháng hiện tại không sau Ngày/Ngày của ngày sinh. –

1

tôi làm điều đó như thế này:

(rút gọn mã một chút)

public struct Age 
{ 
    public readonly int Years; 
    public readonly int Months; 
    public readonly int Days; 

} 

public Age(int y, int m, int d) : this() 
{ 
    Years = y; 
    Months = m; 
    Days = d; 
} 

public static Age CalculateAge (DateTime birthDate, DateTime anotherDate) 
{ 
    if(startDate.Date > endDate.Date) 
     { 
      throw new ArgumentException ("startDate cannot be higher then endDate", "startDate"); 
     } 

     int years = endDate.Year - startDate.Year; 
     int months = 0; 
     int days = 0; 

     // Check if the last year, was a full year. 
     if(endDate < startDate.AddYears (years) && years != 0) 
     { 
      years--; 
     } 

     // Calculate the number of months. 
     startDate = startDate.AddYears (years); 

     if(startDate.Year == endDate.Year) 
     { 
      months = endDate.Month - startDate.Month; 
     } 
     else 
     { 
      months = (12 - startDate.Month) + endDate.Month; 
     } 

     // Check if last month was a complete month. 
     if(endDate < startDate.AddMonths (months) && months != 0) 
     { 
      months--; 
     } 

     // Calculate the number of days. 
     startDate = startDate.AddMonths (months); 

     days = (endDate - startDate).Days; 

     return new Age (years, months, days); 
} 

// Implement Equals, GetHashCode, etc... as well 
// Overload equality and other operators, etc... 

}

5

Một cách khéo léo từ đó ancient thread:

int age = (
    Int32.Parse(DateTime.Today.ToString("yyyyMMdd")) - 
    Int32.Parse(birthday.ToString("yyyyMMdd")))/10000; 
Các vấn đề liên quan