когда пользователи регистрируются на одном из моих сайтов для получения бесплатной пробной версии, я устанавливаю срок их действия на " 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
Так что теперь я снова запутался. Как теперь плюс два дня на секунды, минус сейчас, минус два дня на секунды быть часом на секунды? Куда уходит лишний час?