Странность времени Rails: «x дней с этого момента»

когда пользователи регистрируются на одном из моих сайтов для получения бесплатной пробной версии, я устанавливаю срок их действия на " 14.days.from_now ". Затем на домашней странице я показываю, сколько дней у них осталось, что я получаю с:

(user.trial_expires - Time.now)/86400 

(потому что в сутках 86400 секунд, т.е. 60 * 60 * 24)

Забавно, что их больше 14, поэтому округляется до 15. При ближайшем рассмотрении в консоли это произойдет всего через два дня в будущем (если вы понимаете, о чем я). например,

>> Time.now
=> Fri Oct 29 11:09:26 0100 2010
>> future_1_day = 1.day.from_now
=> Sat, 30 Oct 2010 11:09:27 BST 01:00
#ten past eleven tomorrow

>> (future_1_day - Time.now)/86400
=> 0.999782301526931
#less than 1, what you'd expect right?

>> future_2_day = 2.day.from_now
=> Sun, 31 Oct 2010 11:09:52 GMT 00:00
>> (future_2_day - Time.now)/86400
=> 2.04162248861183
#greater than 2 - why?

Я подумал, может быть, это связано с часовыми поясами - я заметил, что время с 1 дня было по BST, а время через 2 дня было по Гринвичу. Итак, я попытался использовать местное время и получил те же результаты!

>> future_2_day = 2.day.from_now.localtime
=> Sun Oct 31 11:11:24 0000 2010
>> (future_2_day - Time.now)/86400
=> 2.04160829127315
>> (future_2_day - Time.now.localtime)/86400
=> 2.04058651585648

Затем я подумал, насколько велика разница, и оказалось, что это ровно час. Так что это похоже на какую-то странность часового пояса или, по крайней мере, что-то связанное с часовыми поясами, которые я не понимаю. В настоящее время мой часовой пояс - BST (британское летнее время), который на один час позже, чем UTC в данный момент (до этого воскресенья, в этот момент он возвращается к тому же, что и UTC).

Дополнительный час, кажется, вводится, когда я добавляю два дня на Time.now: проверьте это. Я начинаю с Time.now, прибавьте к нему два дня, вычтите Time.now, затем вычтите из результата два дня в секундах, и у меня останется час.

Мне только что пришло в голову, в момент хлопка по голове, что это происходит ПОТОМУ ЧТО ТАКОЕ часы вернитесь в воскресенье утром: то есть в 11.20 в воскресенье утром будет через два дня И еще один час. Я собирался удалить весь этот пост, но потом заметил следующее: я подумал: «А, я могу исправить это, используя (24 * daynum) .hours вместо daynum.days, но я все равно получаю тот же результат: даже когда Я использую секунды!

>> (Time.now + (2*24).hours - Time.now) - 86400*2
=> 3599.99969500001
>> (Time.now + (2*24*3600).seconds - Time.now) - 86400*2
=> 3599.999855

Так что теперь я снова запутался. Как теперь плюс два дня на секунды, минус сейчас, минус два дня на секунды быть часом на секунды? Куда уходит лишний час?

17
задан Mark Thomas 29 October 2010 в 11:01
поделиться