2012-09-18 32 views
5

Tôi muốn loại trừ ngày 29 tháng 2 khỏi các tính toán của mình không có ngày hoàn chỉnh giữa hai ngày. Loại trừ các giá trị góc của khoảng thời gian.Không bao gồm ngày 29 tháng 2 từ khoảng thời gian

kịch bản thử nghiệm:

1 March 2012 - 28th February 2012 = should give 0 days. 
1 March 2012 - 26th February 2012 = should give 2 days. 
1 March 2013 - 28th February 2012 = should give 365 days and not 366 days. 
1 March 2017 - 28th February 2012 = should give 365*5 =1825 days and not 1827 days. 

Hiện nay tôi phân tích năm và kiểm tra xem có bất kỳ năm nhuận giữa ngày và sau đó kiểm tra xem khoảng thời gian có ngày 29 tháng 2. Có cách nào để con số nếu bất kỳ khoảng thời gian cụ thể có một ngày cụ thể và số lần xuất hiện nếu khoảng thời gian kéo dài qua không có năm.

+1

Không quan tâm, tại sao bạn muốn loại trừ ngày 29 tháng 2? –

+2

@ peter-lawrey Tôi đang viết mã cho Công ty bảo hiểm và họ có chính sách không tính phí bảo hiểm cho ngày 29 tháng 2 trong trường hợp chính sách được đầu hàng hoặc chia theo tỷ lệ. – Hulk

Trả lời

1

nhưng không phải do ngày 29 tháng 7, đúng vậy.

nếu bạn so sánh 1 tháng 3 năm 2012 và ngày 28 tháng 2 năm 2012 sẽ trả về 1 ngày và với 29 ngày sẽ trở lại 2 ngày. Sự khác biệt giữa hai ngày này là một ngày.

Để trở về 0 ngày như thế nào bạn muốn, bạn nên so sánh hai thời điểm giống nhau, giống như 01 tháng 3 năm 2012 và ngày 01 tháng ba năm 2012.

Tôi nghĩ bạn đang nhầm ^^ đó.

+0

Tôi đang nói về những ngày hoàn thành giữa hai ngày không bao gồm kết thúc. Tôi sẽ cập nhật câu hỏi để rõ ràng hơn. – Hulk

+0

humm, tôi không biết nếu nó có thể, nhưng nếu bạn thay đổi năm 1900 ví dụ chỉ để so sánh hai ngày? – Cechinel

0

Tôi đã nghe nói về 360 ngày, nhưng đây là lần đầu tiên tôi gặp 365 ngày trong năm.

Đặt cược tốt nhất của bạn là tính toán sự khác biệt giữa các ngày trong ngày và trừ đi tất cả các ngày 29 tháng 2 mà bạn gặp phải.

Điều này có nghĩa là bạn cần một thói quen sẽ trải qua phạm vi ngày của bạn và trả về số lượng ngày 29 tháng 2 mà bạn gặp phải.

Tôi không có ý tưởng làm thế nào để làm điều này trong JodaTime, nhưng các thuật toán cơ bản sẽ là

  • Chuyển đổi ngày bắt đầu với số ngày kể từ ngày 1 tháng 1 năm 1970.
  • Chuyển đổi ngày kết thúc vào số ngày kể từ ngày 1 tháng 1 năm 1970.
  • Vòng lặp từ ngày bắt đầu đến ngày kết thúc một ngày tại một thời điểm.
  • Chuyển đổi ngày lặp lại thành một ngày.
  • nếu ngày là 29 tháng 2, thêm 1 vào số lượt truy cập
  • Sau khi kết thúc vòng lặp, hãy trả lại bộ đếm.
0

Sử dụng javascript bạn có thể đạt được như sau, trong đó startDateendDate là các đối tượng javascript Date.

function calculateDays(startDate,endDate){ 
    var oneDay = 86400000; //ms per day 
    var difference = Math.ceil((endDate.getTime() - startDate.getTime())/oneDay); 
    var totFeb29s = findTotalFeb29s(startDate,endDate); 
    return parseInt(difference)+parseInt(1)-parseInt(totFeb29s);  
}  
function findTotalFeb29s(startDate,endDate){ 
    var totalFeb29s = 0; 
    var startYear = startDate.getFullYear(); 
    var endYear = endDate.getFullYear(); 
    for(var year=startYear;year<=endYear;year++){ 
     var dt = new Date(year, 1, 29); 
     var isLeap = dt.getMonth() == 1; 
     if(isLeap==true && startDate<=dt && dt<=endDate){ 
      totalFeb29s = parseInt(totalFeb29s)+parseInt(1); 
     } 
    } 
    return totalFeb29s; 
}  
+0

tại sao bạn cung cấp câu trả lời javascript?câu hỏi không yêu cầu điều này. –

1

Mã giả mạo Java sau đây sẽ hoạt động. Nó cũng sẽ cho phép bạn thêm các bộ lọc khác nếu bạn muốn:

int daysExcludingLeapYearDay(Date start, Date end) 
{ 
    if(end.isBefore(start)) 
    { 
     return filterOutLeapYearDays(daysBetween(end, start)).size(); 
    } 

    return filterOutLeapYearDays(daysBetween(start, end)).size(); 
} 

List<Date> filterOutLeapYearDays(List<Date> days) 
{ 
    List<Date> daysExcludingLeapYearDays = 
      days 
      .filter(d -> !isFeb29(d)) 
      .toList()); 

    return daysExcludingLeapYearDays; 
} 

List<Date> daysBetween(Date start, Date end) 
{ 
    List<Date> days = new List(); 

    for (Date day = start; day.isBefore(end); day = day.plusOneDay()) 
    { 
     days.add(day); 
    } 

    return days 
} 

boolean isFeb29(Date date) 
{ 
    return date.month == FEBRUARY && date.day == 29; 
} 
Các vấn đề liên quan