2012-04-26 7 views
6

Так, например, если у меня есть следующий код:использование NodaTime для расчета включительно дней период

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

Тогда daysBetween.Days == 1

Однако диапазон рассчитать потребности посчитать, что в 2-х дней. то есть он должен включать дату начала и окончания.

Фактический метод может принимать и начинать и заканчивать дату (не более чем на год) и должен рассчитать количество дней. Если прошло более 31 дня, остаток возвращается как целое целые недели.

У меня есть эта логика, работающая нормально, но поскольку счет является эксклюзивным, я на один день.

Я думаю, что могу просто сделать startDate.addDays(-1), прежде чем создавать nodaStart, но мне интересно, есть ли более элегантный/прекрасный способ вернуть Нода Период.

Благодаря


UPDATE: У меня было чтение из the source code для Period класса и оператор + перегружен, поэтому я могу добавить

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

Работы для Jon тарелочек –

+2

Если вы что, скорее всего, вы должны сделать endDate.AddDays (1). 2012/05/02 - 2012/05/02 00:00 - то есть утром 2-го. Вы хотите ночь второго, так что добавьте день до конца, а не вычитайте день с самого начала. –

ответ

6

(К сожалению это заняло так меня чтобы ответить на этот вопрос - я этого раньше не видел.)

Любой от:

  • Добавление в день до конца, прежде чем вычислить (это самый логичный подход, IMO - как говорит Роджер, вы хотите, чтобы начало следующего дня, эффективно)
  • Вычитание в день от начать перед вычислением
  • Добавление 1 к количеству дней вы получите из конца

должно быть хорошо. Я не думаю, что Noda Time изменится, чтобы сделать это проще. Between - своего рода «нечеткая оболочка» версии оператора вычитания - и вы не найдете много операторов вычитания, где 2 - 1. 2.

+3

+1 для "вы не найдете много операторов вычитания, где 2 - 1 равно 2." :) –

0

Для «нечетких» мозговых людей мы можем рассмотреть период дней быть включительно начала и окончание, если он идентифицирует один день, неделю, месяц и т.д. (см целого кратного), так что вы можете написать код:

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.... 
Смежные вопросы