2012-04-26 15 views
6

Así por ejemplo, si tengo el siguiente código:uso NodaTime para calcular un periodo de días inclusive

var nodaStart = new LocalDate(2012, 5, 1); 
var nodaEnd = new LocalDate(2012,5,2); 
var daysBetween = Period.Between(nodaStart, nodaEnd,PeriodUnits.Day); 

Entonces daysBetween.Days == 1

Sin embargo, el rango de calculo necesidades a eso cuenta como 2 días. es decir, debe incluir la fecha de inicio y finalización.

El método real puede tomar y fecha de inicio y finalización (que no están a más de un año de diferencia) y necesita calcular el número de días. Si hay más de 31 días, el resto se devuelve como un número de semanas completas.

Tengo esa lógica funcionando bien, pero como el recuento es exclusivo, estoy fuera un día.

Supongo que puedo hacer startDate.addDays(-1) antes de crear nodaStart, pero me pregunto si hay una forma más elegante/bonita de que noda devuelva el Período.

Gracias


ACTUALIZACIÓN: he tenido una lectura de the source code para la clase Period y el operador + está sobrecargado por lo que puedo añadir

daysBetween += Period.FromDays(1); 
+0

trabajo para Jon Skeet –

+2

Si lo hace eso, probablemente deberías hacer endDate.AddDays (1) en su lugar. 2012/05/02 es 2012/05/02 00:00 - es decir, la mañana del 2 de febrero. Desea la noche del 2, así que agregue un día hasta el final, en lugar de restar un día desde el principio. –

Respuesta

6

(Lo siento que soy yo adoptadas hasta largo para responder a esto - No lo había visto antes.)

Cualquiera de:

  • Adición de un día para el final antes de calcular (esta es la solución más lógica, la OMI - como dice Roger, desea que el comienzo del día siguiente, efectivamente)
  • Restando de un día de la comenzar antes de calcular
  • Añadiendo 1 al número de días que se obtiene fuera del extremo

debe estar bien. No creo que Noda Time cambie para simplificar esto. Between es una especie de versión "difusa alrededor de unidades" de un operador de resta - y no encontrará muchos operadores de resta donde 2 - 1 es 2.

+3

+1 para "no encontrará muchos operadores de resta donde 2 - 1 es 2". :) –

0

Para humanos con cerebro "borroso", podemos considerar un período de días para ser incluido de inicio y de finalización si se identifica un solo día, semana, mes, etc (cf. toda múltiplo de), por lo que podría codificarlo:

var start = new NodaTime.LocalDateTime(s.Year, s.Month, s.Day, s.Hour, s.Minute); 
var end = new NodaTime.LocalDateTime(e.Year, e.Month, e.Day, e.Hour, e.Minute); 

NodaTime.Period periodInclusive = NodaTime.Period.Between(start, end.PlusDays(1), NodaTime.PeriodUnits.AllDateUnits); 
NodaTime.Period period = NodaTime.Period.Between(start, end, NodaTime.PeriodUnits.AllDateUnits); 
bool isInclusivePeriod = periodInclusive.Days + periodInclusive.Weeks + periodInclusive.Months + periodInclusive.Years < 
         period.Days + period.Weeks + period.Months + period.Years; 

period = isInclusivePeriod ? periodInclusive : period; 
// do stuff with period here.... 
Cuestiones relacionadas