2011-01-20 47 views
6
DateTime dayStart; 
DateTime dateEnd; 

TimeSpan ts = dateEnt - dateStart; 

In: ... Năm (s) và ... Tháng (s)cách tìm sự khác biệt giữa năm và tháng giữa hai ngày?

làm thế nào tôi có thể tính toán nó?

net framework 2.0
C#

dự án asp.net.

+0

Bạn cần (nhiều định nghĩa) ở đây. Bao nhiêu tháng trong khoảng thời gian từ 31-01-2011 đến 01-02-2011? Nếu bạn muốn phân số, một tháng là bao lâu? –

Trả lời

3

Điều đó phụ thuộc vào những gì bạn muốn tính toán chính xác.

Bạn không thể dịch giá trị trong một số TimeSpan thành năm và tháng chính xác, do độ dài của năm và tháng thay đổi. Bạn có thể tính toán các năm và tháng gần đúng như sau:

int years = ts.Days/365; 
int months = (ts.Days % 365)/31; 

Nếu bạn muốn có sự khác biệt chính xác, bạn phải so sánh giá trị DateTime.

7

You should first read this article từ Jon Skeet, đặc biệt từ văn bản "Giới thiệu khoảng thời gian và số học kỳ", điều này sẽ rất thú vị đối với bạn.

Vì vậy, bạn phải xác định khi một thời gian nhất định là một sự thay đổi trong tháng, trong năm, vv

Noda-time đã có chứa rất nhiều các chức năng cho việc này. Nhưng tôi không nghĩ rằng nó được phát hành.

+1

Gah, đâu là điểm của tôi khi đặt câu hỏi, tất cả đều vui mừng trước viễn cảnh nhắc đến Noda Time nếu người khác làm điều đó cho tôi? ;) –

+0

@Jon: Xin lỗi, chỉ cần nhớ tôi đã đọc bài viết. – GvS

+0

Wow, tôi chưa bao giờ nghe nói về Noda-Time, và không bao giờ thực sự nghĩ về sự phức tạp của việc tính toán ngày/thời gian kéo dài. Đọc liên kết được đăng lần đầu tiên tôi tiếp tục suy nghĩ "Ừ .. Đúng rồi. Sao tôi chưa bao giờ nghĩ đến điều đó?" 1 để đăng nó và một lần nữa, nhờ những người sáng tạo của StackOverflow cho tôi một cái gì đó mới để suy nghĩ về việc cho phép con chó cũ này để tìm hiểu một thủ thuật mới. – David

2

Tôi nghĩ rằng một cái gì đó như thế này sẽ làm điều đó:

DateTime date1 = new DateTime(1973, 07, 20); 
    DateTime date2 = new DateTime(2010, 01, 10); 

    // Swap them if one is bigger than the other 
    if (date2 < date1) 
    { 
    DateTime date3 = date2; 
    date2 = date1; 
    date1 = date3; 
    } 

    // Now date2 >= date1. 

    TimeSpan ts = date2 - date1; 

    // Total days 
    Console.WriteLine(ts.TotalDays); 

    // Total years 
    int years = date2.Year - date1.Year; 

    int months = 0; 
    // Total monts 
    if (date2.Month < date1.Month) 
    { 
    // example: March 2010 (3) and January 2011 (1); this should be 10 monts 
    // 12 - 3 + 1 = 10 
    // Take the 12 months of a year into account 
    months = 12 - date1.Month + date2.Month; 
    } 
    else 
    { 
    months = date2.Month - date1.Month; 
    } 
    Console.WriteLine("Years: {0}, Months: {1}", years, months); 

Sửa Để làm rõ: Không cần cho algorhitms ngày phức tạp hoặc bất kỳ của các loại công cụ, bởi vì lúc nào cũng có 12 tháng trong một năm (ít nhất là trong lịch của chúng tôi).

3

Sau đây sẽ tính tuổi theo năm, tháng, ngày

DateTime dob = "10/18/1981"; // ngày sinh Ngày giờ bây giờ = DateTime.Now;

 // Swap them if one is bigger than the other 
     if (now < dob) 
     { 
      DateTime date3 = now; 
      now = dob; 
      dob = date3; 
     } 
     TimeSpan ts = now - dob; 
     //Debug.WriteLine(ts.TotalDays); 

     int years = 0; 
     int months = 0, days=0; 
     if ((now.Month <= dob.Month) && (now.Day < dob.Day)) // i.e. now = 03Jan15, dob = 23dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year-1; 
      months = 12 - dob.Month + now.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 

      if(months==12) 
      { 
       months=0; 
       years +=1; 
      } 
     } 
     else if ((now.Month <= dob.Month) && (now.Day >= dob.Day)) // i.e. now = 23Jan15, dob = 20dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year - 1; 
      months = 12 - dob.Month + now.Month; 
      days = now.Day - dob.Day; 
      if (months == 12) 
      { 
       months = 0; 
       years += 1; 
      } 
     } 
     else if ((now.Month > dob.Month) && (now.Day < dob.Day)) // i.e. now = 18oct15, dob = 22feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 
     } 
     else if ((now.Month > dob.Month) && (now.Day >= dob.Day)) // i.e. now = 22oct15, dob = 18feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month; 
      days = now.Day - dob.Day; 
     } 
     Debug.WriteLine("Years: {0}, Months: {1}, Days: {2}", years, months, days); 
Các vấn đề liên quan