2016-10-22 5 views
0

Этот код не должен иметь, с моей точки зрения, различные результаты между третьим и вторым примерами.Большое расхождение в рубине Арифметика времени, используемая с активной поддержкой Расширения времени

0> Time.utc(1999, 12, 29) - Time.utc(1999, 12, 29) 
=> 0.0 

0> Time.utc(1999, 12, 29) + 1.month - Time.utc(1999, 12, 29) 
=> 2678400.0 

0> 1.month.to_i 
=> 2592000 

Как ни странно, когда я конвертирую все в Fixnum, он вернется к работе, как ожидалось.

0> Time.utc(1999, 12, 29).to_i + 1.month.to_i - Time.utc(1999, 12, 29).to_i 
=> 2592000 

Что происходит?

+0

Я думаю, что получаю его, но не могу найти доказательство .. «+ 1.month» адаптируется к тому месяцу, к которому он присоединяется? и результат моих последних примеров работает так, как ожидалось (to_i), потому что в этом месяце нет контекста, поэтому он использует текущий месяц. –

ответ

0

Time + 1.month обычно возвращается в тот же день следующего месяца (может быть +31 дней), но 1.month.to_i составляет 30 дней

irb> Time.utc(1999, 12, 29) + 1.month 
=> 2000-01-29 00:00:00 UTC 
irb> Time.utc(1999, 12, 29) + 1.month.to_i 
=> 2000-01-28 00:00:00 UTC 

(В вашем примере разница 86400 секунд, что равняется 1 день)