2012-02-06 5 views
3

Мне нужно хранить несколько периодов времени в файле YAML, как это:Почему `from_now` неправильно при вызове Fixnum?

test: 
testing: <%= 1.month %> 

Я захватить данные в инициализаторе так:

Class::TIMES = YAML.load(ERB.new(File.new(Rails.root.join('config', 'times.yml')).read).result) 

До сих пор так хорошо. Но время, которое я получаю от этого, всегда отключается днем; тестирование показывает это. Например:

<Tue, 06 Mar 2012> expected but was <Wed, 07 Mar 2012>. 

Тест линии:

assert_equal 1.month.from_now.to_date, @object.finished_at.to_date 

В другом месте, finished_at @ объекта устанавливается следующим образом:

# duration is from the YAML file 
self.finished_at = duration.from_now 

Он всегда кажется, быть смещена на один день, независимо от того, какой период времени я вложил в файл YAML. Почему это происходит?

EDIT: Это, как представляется, проблема с Fixnums и from_now:

> 1.month.from_now 
=> Tue, 06 Mar 2012 21:05:00 UTC +00:00 

> 1.month.to_i.from_now 
=> Wed, 07 Mar 2012 21:05:05 UTC +00:00 
+1

Какой часовой пояс вы используете для тестирования? Вы должны использовать UTC для всех значений внутри себя и рендеринга в локальную часовую зону пользователя для отображения. – tadman

+0

Они все UTC. Но я думаю, что нашел реальную проблему. Я отредактировал свой вопрос соответствующим образом. –

ответ

2

При преобразовании 1.month в целое это произвольные множества продолжительность получения передаваемых в from_now до 2592000 секунд, то есть 30 дней независимо от того, какой это месяц.

Я столкнулся с этим вопросом раньше. Ознакомьтесь с документацией для Data and Time Helper Methods.

В то время как эти методы обеспечивают точный расчет при использовании, как в приведенных выше примерах («.. 1.month.from_now ..»), следует соблюдать осторожность, чтобы отметить, что это не так, если результат months’, лет, и т. Д. преобразован до использования