Ты делаешь это слишком сложно. Просто выясните, сколько секунд осталось до полуночи, затем sleep
.
Я использовал что-то подобное в прошлом:
require 'date'
def seconds_until_midnight
Date.today.next_day.to_time.to_i - Time.now.to_i
end
Тестирование:
5.times do
puts '%i seconds until midnight' % seconds_until_midnight()
sleep 1
end
# >> 35142 seconds until midnight
# >> 35141 seconds until midnight
# >> 35140 seconds until midnight
# >> 35139 seconds until midnight
# >> 35138 seconds until midnight
Просто используйте:
sleep seconds_until_midnight()
или измените код на:
require 'date'
def sleep_until_midnight
midnight = Date.today.next_day.to_time.to_i - Time.now.to_i
sleep midnight
end
и позвоните sleep_until_midnight()
.
Магическая часть:
Date.today # => #<Date: 2020-04-09 ((2458949j,0s,0n),+0s,2299161j)>
Date.today.next_day # => #<Date: 2020-04-10 ((2458950j,0s,0n),+0s,2299161j)>
Date.today.next_day.to_time # => 2020-04-10 00:00:00 -0700
Даты не содержат компонент времени, поэтому Ruby выдумывает и добавляет «полночь», AKA 00:00:00
, при преобразовании в объект Time.
Если вы хотите уменьшите или увеличьте время ожидания n
секунд, вычтите или добавьте это значение к midnight
и измените сигнатуру метода:
def sleep_until_midnight(offset)
:
:
sleep midnight + offset
end
и вызовите его следующим образом:
sleep_until_midnight(-5)
sleep_until_midnight(+1)
Хотя По аналогии с тем, что говорит Тодд Джейкобс в своем ответе, почему? Тесты должны выполняться немедленно, а не в определенное время c, чтобы вы могли получать результаты и реагировать на них по мере разработки. Если нужно проверить, существует ли страница или проанализировать ли ее в указанное c время, используйте cron
или что-то подобное.