2010-04-26 16 views
8

He usado boost :: gregorian :: date un poco ahora.número de meses entre dos fechas - usando la fecha de impulso

Veo que están los meses relacionados & años & semanas tipos de duración. Veo cómo usar las duraciones conocidas para avanzar en una fecha determinada.

Qu: ¿Pero cómo puedo obtener la diferencia entre dos fechas en meses (o años o semanas)?

Tenía la esperanza de encontrar una función como:

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

No tendría que haber alguna manipulación de redondeo también.

Esta función devolvería el número de (digamos) meses enteros entre d1 y d2.

Respuesta

10

¿Se refiere a la diferencia entre fechas (09/12 - 08/05 = 01/07 = 19 meses) o diferencia en el tiempo ((date2_seconds - date1_seconds)/seconds_per_month)?

Para el primer caso es posible utilizar métodos de acceso

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

Entonces diferencia entre las fechas en meses:

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

Para el segundo caso que no es el operador

date_duration date::operator-(date) const; 

Y date_dura ción ha siguiente miembro útil:

long date_duration::days() const; 

para que pueda hacer la siguiente manera:

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

Sí, lo siento si eso no era clara. Me refiero a la cantidad de meses entre dos fechas. (O bien redondeado hacia arriba o hacia abajo, de alguna manera.) Aclararé la pregunta. BTW, la última línea de código da el número de días, no meses, ¿verdad? ¿Está escrito más claramente como num_days en lugar de meses? P. ej. : int num_days = (date2-date1) .days(); – MartinP

+0

sí, ese fue mi error :) ahora se ha corregido un poco. En realidad, si desea el número correcto de meses para períodos largos, es mejor usar 365.25/12 en lugar de 30. –

+0

Gracias por la información, pero lo siento, no estoy convencido por ese enfoque. Cualquier tratamiento basado en todos los meses tiene aproximadamente la misma duración y se obtendrá mal en algunos casos especiales. Como el caso patológico de febrero en un año bisiesto. Si di d1 para ser 30-Jan y d2 para 1-Mar, entonces la separación en días sería 28 (en un año bisiesto). Si solo observamos esa cifra de 28 días, no podemos saber si las dos fechas están en el mismo mes o posiblemente separadas por todos los de febrero. Es por eso que creo que necesitaríamos un calendario gregoriano para calcular cuántos meses del calendario completo hay entre dos fechas. – MartinP

Cuestiones relacionadas