2010-04-26 18 views
8

Ho usato boost :: gregorian :: date un po 'ora.numero di mesi tra due date - utilizzando la data di boost

Vedo che ci sono i mesi correlati & anni & tipi di durata settimane. Riesco a vedere come utilizzare le durate note per far avanzare una determinata data.

Qu: Ma come posso ottenere la differenza tra due date in mesi (o anni o settimane)?

speravo di trovare una funzione simile:

template<typename DURATION> 
    DURATION date_diff<DURATION>(const date& d1,const date& d2); 

Non ci sarebbe bisogno di essere un po 'di movimentazione di arrotondamento troppo.

Questa funzione restituirebbe il numero di (diciamo) interi mesi tra d1 e d2.

risposta

10

Intendi differenza tra le date (09/12 - 08/05 = 01/07 = 19 mesi) o la differenza di tempo ((date2_seconds - date1_seconds)/seconds_per_month)?

Per il primo caso è possibile utilizzare funzioni di accesso

greg_year date::year() const; 
greg_month date::month() const; 

Poi differenza tra le date in mesi:

int months = (data2.year() - date1.year())*12 + date2.month() - date1.month() 

Per il secondo caso non v'è operatore

date_duration date::operator-(date) const; 

E date_dura zione ha seguito membro utile:

long date_duration::days() const; 

modo da poter fare in questo modo:

//date date1, date2 
int months = (date2-date1).days()/30; 
+0

Sì, mi dispiace se non fosse chiaro. Intendo il numero di mesi tra due date. (O arrotondato in su o in giù, in qualche modo.) Chiarirò la domanda. BTW, l'ultima riga di codice indica il numero di giorni, non di mesi, giusto? È scritto più chiaramente come num_days piuttosto che mesi? E.g. : int num_days = (date2-date1) .days(); – MartinP

+0

sì, quello è stato il mio errore :) ora è corretto un po '. In realtà se si desidera un numero corretto di mesi per lunghi periodi è meglio usare 365,25/12 anziché 30. –

+0

Grazie per il pensiero, ma mi dispiace, non sono convinto da questo approccio. Qualsiasi trattamento basato su tutti i mesi è di circa la stessa lunghezza e si sbaglia in alcuni casi speciali. Come il caso patologico di febbraio in un anno bisestile. Se ho preso d1 per essere 30 gennaio e d2 per essere 1 marzo, la separazione in giorni sarebbe 28 (in un anno bisestile). Guardando solo a quella cifra di 28 giorni, non possiamo sapere se le due date sono nello stesso mese o eventualmente separate da tutti di febbraio. Ecco perché penso che avremmo bisogno di un calendario gregoriano per calcolare quanti mesi di calendario sono compresi tra due date. – MartinP

Problemi correlati