2012-02-03 45 views
8

Có ai có thuật toán trong C# để tính toán chính xác độ tuổi được cung cấp một DateTime theo định dạng Years.Months không?Tính tuổi từ định dạng DateTime ở định dạng Years.Months?

ví dụ:

  • DOB: 6-Sep-1988
  • Trả lời: 23,4

  • DOB: 31-Mar-1991

  • Trả lời: 20,10

  • DOB: 25-Feb -1991

  • Trả lời: 20.11

nhờ

+0

bạn đã kiểm tra TimeSpan struct ??? –

+1

@Ravi: Bạn có nghĩ về việc liệu điều đó có thể xác định chính xác số tháng và năm giữa hai ngày không? –

+0

không, nghĩ đến việc đề xuất NodaTime, nhưng khi "daemon" còn sống trên SO, thì tại sao phải lo lắng, bạn sẽ nghĩ ra một cách rõ ràng :) –

Trả lời

11

Bạn có thể làm điều này trong Noda Time khá dễ dàng:

using System; 
using NodaTime; 

class Test 
{ 
    static void Main() 
    { 
     ShowAge(1988, 9, 6); 
     ShowAge(1991, 3, 31); 
     ShowAge(1991, 2, 25); 
    } 

    private static readonly PeriodType YearMonth = 
     PeriodType.YearMonthDay.WithDaysRemoved(); 

    static void ShowAge(int year, int month, int day) 
    { 
     var birthday = new LocalDate(year, month, day); 
     // For consistency for future readers :) 
     var today = new LocalDate(2012, 2, 3); 

     Period period = Period.Between(birthday, today, YearMonth); 
     Console.WriteLine("Birthday: {0}; Age: {1} years, {2} months", 
          birthday, period.Years, period.Months); 
    } 
} 

Làm nó với chỉ hỗ trợ DateTime NET của sẽ có thể, nhưng bạn sẽ phải làm số học cho mình, về cơ bản. Và nó gần như chắc chắn sẽ không rõ ràng. Không phải là tôi thiên vị hoặc bất cứ điều gì :)

+0

* Bạn *, * độ lệch *, về * Ngày giờ *? Noooo ...;) –

+0

btw; liên kết thời gian của bạn có đúng không? Tôi nhận được một 404. –

+1

@AndrewBarber: Bạn phải thừa nhận, đó là mã khá ngọt ngào mặc dù :) –

-1
var date=new DateTime(DateTime.Now.Subtract(new DateTime(1988,10,31)).Ticks); 
Console.WriteLine((date.Year-1).ToString()+"."+(date.Month-1).ToString()); 
+1

Không chắc chắn ý bạn là gì – linkerro

+0

Điều này sẽ hoàn toàn bị hỏng trong một số trường hợp. Ví dụ: sinh nhật ngày 1 tháng 2 năm 2012, với ngày "ngày hôm nay" hoặc ngày 1 tháng 3 năm 2012 ... đó là 29 ngày trước, điều này sẽ cung cấp cho 0 tháng sử dụng mã này. –

+0

@AndrewBarber: Nó thực sự không. Nó bị hỏng. –

2

Phương pháp này không đòi hỏi bất kỳ thư viện bên ngoài:

private static string AgeInYearsMonths(DateTime? DateOfBirth) 
{ 
    if (DateOfBirth == null) return ""; 
    if (DateOfBirth >= DateTime.Today) 
     throw new ArgumentException("DateOfBirth cannot be in future!"); 

    DateTime d = DateOfBirth.Value; 
    int monthCount = 0; 
    while ((d = d.AddMonths(1)) <= DateTime.Today) 
    { 
     monthCount++; 
    } 
    return string.Format("{0}.{1}", monthCount/12, monthCount % 12); 
} 
Các vấn đề liên quan