2012-04-26 11 views
6

Tak na przykład jeśli mam następujący kod:użycie NodaTime obliczyć integracyjnego dniowy okres

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

Następnie daysBetween.Days == 1

Jednak zakres obliczyć musi liczyć, że w ciągu 2 dni. tj. musi zawierać datę początkową i końcową.

Faktyczna metoda może przyjąć i datę rozpoczęcia i zakończenia (nie więcej niż jeden rok) i musi obliczyć liczbę dni. Jeśli jest więcej niż 31 dni, to pozostała część jest zwracana jako liczba całych tygodni.

Ta logika działa dobrze, ale ponieważ liczba jest wyjątkowa, jestem jeden dzień.

Zgaduję, że mogę po prostu zrobić startDate.addDays(-1), zanim stworzę z tego nodaStart, ale zastanawiam się, czy istnieje bardziej elegancki/ładny sposób, aby noda zwrócił okres.

Dzięki


UPDATE: miałem lektury the source code dla klasy Period i operator + jest przeciążony, więc mogę dodać

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

Praca dla Jon Skeet –

+2

Jeśli zrobisz to prawdopodobnie powinieneś zamiast tego zrobić endDate.AddDays (1). 2012/05/02 to 2012/05/02 00:00 - rano drugiego dnia. Chcesz nocy 2, więc dodaj dzień do końca, zamiast odejmowania jednego dnia od początku. –

Odpowiedz

6

(Przepraszam, że zajęło mi to długo na to odpowiedzieć - nie widziałem tego wcześniej.)

Dowolny od:

  • Dodawanie dzień do końca przed obliczeniem (jest to najbardziej logiczne podejście, IMO - jak mówi Roger, chcesz rozpoczęcia następnego dnia, skutecznie)
  • Odjęcie dziennie w rozpocząć przed obliczeniem
  • dodanie 1 do liczby dni, można dostać się na koniec

powinno być dobrze. Nie sądzę, żeby Noda Time się zmienił, żeby było prostsze. Between to rodzaj "oderwanego operatora" od operatora odejmującego - i nie znajdziesz wielu operatorów odejmujących, gdzie 2 - 1 to 2.

+3

+1 dla "nie znajdziesz wielu operatorów odejmujących, gdzie 2 - 1 wynosi 2." :) –

0

Dla "niewyraźnych" mózgów ludzi, możemy wziąć pod uwagę okres dni być włącznie od daty rozpoczęcia i zakończenia, jeżeli identyfikuje jeden dzień, tydzień, miesiąc, etc (por pełnej wielokrotności), więc można go zakodować:

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....