2012-04-26 33 views
6

Così, per esempio se ho il seguente codice:uso NodaTime per calcolare un periodo compreso giorni

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

Poi daysBetween.Days == 1

Tuttavia, la gamma a calcolare esigenze per contare che, come 2 giorni. cioè deve includere la data di inizio e di fine.

Il metodo effettivo può richiedere e iniziare e terminare la data (che non è più di un anno) e deve calcolare il numero di giorni. Se ci sono più di 31 giorni, il resto viene restituito come numero di intere settimane.

Ho quella logica che funziona bene ma perché il conto è esclusivo, sono un giorno fuori.

Credo di poter fare solo startDate.addDays(-1) prima di creare nodaStart da esso, ma mi chiedo se ci sia un modo più elegante/bello per avere il ritorno del Periodo in noda.

Grazie


UPDATE: ho avuto una lettura di the source code per la classe Period e l'operatore + è sovraccarico in modo da poter aggiungere

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

lavoro per Jon Skeet –

+2

Se lo fai questo, probabilmente dovresti fare invece endDate.AddDays (1). 2012/05/02 è 2012/05/02 00:00 - cioè la mattina del 2. Vuoi la notte del 2 °, quindi aggiungi un giorno alla fine, invece di sottrarre un giorno dall'inizio. –

risposta

6

(Ci dispiace che sono io presi così a lungo per rispondere - non l'avevo mai visto prima.)

Qualsiasi di:

  • L'aggiunta di un giorno fino alla fine prima di calcolare (questo è l'approccio più logico, IMO - come dice Roger, si desidera che l'inizio del giorno successivo, in modo efficace)
  • sottrazione di una giornata dal iniziare prima di calcolare
  • Aggiungendo 1 al numero di giorni che si ottiene fuori alla fine

dovrebbe andare bene. Non credo che Noda Time cambierà per renderlo più semplice. Between è una sorta di versione "fuzzy around units" di un operatore di sottrazione - e non troverete molti operatori di sottrazione dove 2 - 1 è 2.

+3

+1 per "non troverete molti operatori di sottrazione dove 2 - 1 è 2." :) –

0

Per umani "sfocati", possiamo considerare un periodo di giorni per essere comprensivo di inizio e di fine se identifica un solo giorno, settimana, mese, ecc (cfr multiplo intero di), così si potrebbe 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.... 
Problemi correlati