2012-09-18 8 views
5

Desidero escludere il 29 febbraio dai miei calcoli di no di giorni completi tra due date. Escludendo i valori degli angoli dell'intervallo.Escludi 29 febbraio dall'intervallo di tempo

scenari di test:

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. 

Attualmente mi analizzare anno e verificare se c'è qualche anno bisestile tra le date e quindi verificare se l'intervallo è 29 febbraio. C'è un modo per capire se un particolare intervallo ha un giorno particolare e il numero di occorrenze se l'intervallo si estende su no degli anni.

+1

Fuori interesse, perché vuoi escludere il 29 febbraio? –

+2

@ peter-lawrey Sto scrivendo il codice per una compagnia di assicurazioni e hanno una politica per non addebitare il premio per il 29 febbraio nel caso in cui la polizza venga resa o proporzionale. – Hulk

risposta

1

ma non è causato da feb 29, è giusto.

se si prenota tra 1 marzo 2012 e 28 febbraio 2012 tornerà 1 giorno, e con 29 tornerà 2 giorni. La differenza tra queste due date è di un giorno.

Per tornare 0 giorni come si desidera che si dovrebbe confrontare due stesse date, come 1 marzo 2012 e il 1 ° marzo 2012.

Penso che tu stia confondendo che ^^.

+0

Sto parlando di giorni completi tra due date escludendo le estremità. Aggiornerò la domanda per maggiore chiarezza. – Hulk

+0

humm, non so se è possibile, ma se cambi l'anno al 1900 per esempio solo per confrontare le due date? – Cechinel

0

Ho sentito parlare di 360 anni al giorno, ma questa è la prima volta che ho incontrato un anno di 365 giorni.

La cosa migliore è quello di calcolare la differenza tra le date in giorni, e sottrarre fuori tutto il del che si incontrano 29 febbraio.

Il che significa che hai bisogno di una routine che passerà attraverso la vostra gamma di date e di restituire un conteggio del numero di 29 Febbraio è che si incontra.

non ho idea di come fare questo in JodaTime, ma l'algoritmo di base sarebbe

  • convertire la data di inizio per il numero di giorni a partire dal 1 gennaio 1970.
  • Convertire la data di fine alla numero di giorni dal 1 ° gennaio 1970.
  • Ciclo dal giorno di inizio alla fine del giorno un giorno alla volta.
  • Converti il ​​giorno del ciclo in una data.
  • se la data è 29 febbraio, aggiungere 1 a un contatore
  • Dopo aver terminato il ciclo, restituire il contatore.
0

Utilizzo di javascript è possibile acheive come segue, dove startDate e endDate sono javascript Date oggetti.

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

perché stai fornendo una risposta javascript?la domanda non chiede questo. –

1

Il seguente pseudo-codice Java dovrebbe funzionare. Ti consentirebbe inoltre di aggiungere altri filtri se lo desideri:

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