2013-05-10 2 views
1

Я начал с (date2 - date1).round, теперь у этого должна быть работа.Ruby: Как правильно рассчитать разницу по дате?

Проблема:

06 Jan, 2013 до 05 февраля 2013 года =>30

06 Февраль, 2013 до 05 марта 2013 года =>27

06 Март, 2013 по 05 апреля 2013 года =>30

6 апреля 2013 по 27 апреля 2013 года =>21

(Date.strptime('05 Feb,2013', '%d %b, %Y') - Date.strptime('06 Jan,2013', '%d %b,%Y')).round 
(Date.strptime('05 Mar,2013', '%d %b, %Y') - Date.strptime('06 Feb,2013', '%d %b,%Y')).round 
(Date.strptime('05 Apr,2013', '%d %b, %Y') - Date.strptime('06 Mar,2013', '%d %b,%Y')).round 
(Date.strptime('27 Apr,2013', '%d %b, %Y') - Date.strptime('06 Apr,2013', '%d %b,%Y')).round 

Поэтому

Total = 108 days [ 30 + 27 + 30 + 21 ] 

Но когда я пытаюсь вычислить его в 1 идут как:

(Date.strptime('27 Apr,2013', '%d %b, %Y') - Date.strptime('06 Jan,2013', '%d %b,%Y')).round 

Это дает:

Days = 111 days 

Теперь 108 дней! = 111 дней

Что я делаю неправильно?

+2

У вас ошибка совсем по одному в своем первом методе. Вы не считаете день между расчетами. – mcfinnigan

+0

На самом деле между 6 января и 27 апреля есть 111 дней. – Shoe

+0

Я не уверен, но Рубин придирчив к пробелам? У вас есть дополнительное пространство между форматом ',' и '% Y' с левой стороны, но не справа. –

ответ

3

Вам не хватает одного дня между интервалами в вашем первом коде.

Я увеличил дату окончания первых 3 дат, так что это соответствует началу следующего.

p (Date.strptime('06 Feb,2013', '%d %b, %Y') - Date.strptime('06 Jan,2013', '%d %b,%Y')).round 
p (Date.strptime('06 Mar,2013', '%d %b, %Y') - Date.strptime('06 Feb,2013', '%d %b,%Y')).round 
p (Date.strptime('06 Apr,2013', '%d %b, %Y') - Date.strptime('06 Mar,2013', '%d %b,%Y')).round 
p (Date.strptime('27 Apr,2013', '%d %b, %Y') - Date.strptime('06 Apr,2013', '%d %b,%Y')).round 

Выход:

31 
28 
31 
21 

Sum = 111

0

Thans, @Dogbert. Вы правы, мне не хватает 1

Хотя, как было предложено, мне не хватает 1 day во всех расчетах .. т. Е.

Neither of 108 or 111 are correct - Instead both are wrong

Так, его вычисления открытого диапазона difference between(d1, d2) instead of [d1, d2)

Поэтому я хотел бы добавить ко всем из них:

1 + (Date.strptime('05 Feb,2013', '%d %b, %Y') - Date.strptime('06 Jan,2013', '%d %b,%Y')).round 
1 + (Date.strptime('05 Mar,2013', '%d %b, %Y') - Date.strptime('06 Feb,2013', '%d %b,%Y')).round 
1 + (Date.strptime('05 Apr,2013', '%d %b, %Y') - Date.strptime('06 Mar,2013', '%d %b,%Y')).round 
1 + (Date.strptime('27 Apr,2013', '%d %b, %Y') - Date.strptime('06 Apr,2013', '%d %b,%Y')).round 

Таким образом, общая = 112 [На этот раз]

Аналогичным образом, я должен add 1 до полного диапазона:

1 + (Date.strptime('27 Apr,2013', '%d %b, %Y') - Date.strptime('06 Jan,2013', '%d %b,%Y')).round 

Это подводит к 1 + 111 = 112 [Single] общей

Таким образом, 112 == 112

Смежные вопросы