Большое расхождение в арифметике ruby ​​Time, используемой с активной поддержкой Time extensions

Насколько я понимаю, этот код не должен давать разные результаты между третьим и вторым примерами.

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

Что здесь происходит?


person Maxim Veksler    schedule 22.10.2016    source источник
comment
Я думаю, что понимаю, но не могу найти доказательства.. + 1.month адаптируется к месяцу, к которому он добавляется? и в результате мои последние примеры работают так, как ожидалось (to_i), потому что месяц не имеет контекста, поэтому он использует текущий месяц.   -  person Maxim Veksler    schedule 23.10.2016


Ответы (1)


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 дню)

person Alex Avoiants    schedule 22.10.2016