Ejemplo: dado dos fechas a continuación, acabado es siempre mayor o igual a empezar¿Cómo calcular la diferencia real de meses (año calendario no aproximado) entre dos fechas determinadas en C#?
inicio = 2001 Ene 01
acabado = 2002 Mar 15
Así que desde 2001 01 de enero hasta el final de 2002 Feb
meses = 12 + 2 = 14
Para 2002 Marzo
15/30 = 0,5
tan gran total es 14,5 diferencia meses.
Es muy fácil trabajar a mano, pero ¿cómo puedo codificarlo elegantemente? Por el momento tengo la combinación de mucho más o menos para lograr lo que quiero, pero creo que hay soluciones más simples por ahí.
Actualización: la salida tiene que ser precisa (no aproximación), por ejemplo: si inicio 2001 Ene 01 y terminar 2001 16-abr-La salida debe ser 1 + 1 + 1 = 3 (para Jan, Feb y Mar) y 16/31 = 0.516 meses, por lo que el total es 3.516.
Otro ejemplo sería si comienzo en 2001 5, Jul 2002 y terminará el 10 de Jul, la salida debe ser 11 meses hasta finales de junio de 2002, y (31-5)/31 = 0,839 y 10/31 = 0.323 meses, por lo que el total es 11 + 0.839 + 0.323 = 12.162.
extendí 'código de s y Hightechrider' Josh Stodola código de s:
public static decimal GetMonthsInRange(this IDateRange thisDateRange)
{
var start = thisDateRange.Start;
var finish = thisDateRange.Finish;
var monthsApart = Math.Abs(12*(start.Year - finish.Year) + start.Month - finish.Month) - 1;
decimal daysInStartMonth = DateTime.DaysInMonth(start.Year, start.Month);
decimal daysInFinishMonth = DateTime.DaysInMonth(finish.Year, finish.Month);
var daysApartInStartMonth = (daysInStartMonth - start.Day + 1)/daysInStartMonth;
var daysApartInFinishMonth = finish.Day/daysInFinishMonth;
return monthsApart + daysApartInStartMonth + daysApartInFinishMonth;
}
Gracias a aquellos de ustedes que ofrecieron la solución de aproximación, pero necesito una forma elegante de calcular la diferencia de meses por mes/año/día. Es por eso que mi solución actual contiene if else para cada ciclo while. – Jeff
Tus cálculos parecen suponer que el final incluye todo ese día. ¿Es eso lo que realmente quieres? El 15 de marzo como valor 'DateTime' tiene una hora de medianoche, lo que significa que han pasado 14 días en marzo fuera de la posible 31. –
@Hightechrider, el día de inicio es siempre el 00: 00: 00: 1 milisegundo, y el terminar el día siempre es 23: 59: 59: 999. entonces, si el inicio y el final son el mismo día, se cuentan como 1 día. – Jeff