end
end
Я привел этот код только для того, чтобы прояснить алгоритм; конечно, гораздо проще вызвать метод Date.leap?
. В моей реализации это метод класса по аналогии с классом Date
, но можно было бы сделать его и методом экземпляра.
7.13. Определение часового пояса
Метод zone
класса Time
возвращает название часового пояса в виде строки:
z1 = Time.gm(2000,11,10,22,5,0).zone # 'GMT-6:00'
z2 = Time.local(2000,11,10,22,5,0).zone # 'GMT-6:00'
К сожалению, время хранится относительно текущего часового пояса, а не того, для которого был создан объект. При желании можно скорректировать его самостоятельно.
7.14. Манипулирование временем без даты
Иногда нужно работать с временем дня в виде строки. На помощь снова приходит метод strftime
. Можно «разбить» время на часы, минуты и секунды
t = Time.now
puts t.strftime('%H:%M:%S') # Печатается 22:07:45
А можно только на часы и минуты (прибавив 30 секунд, мы даже можем округлить до ближайшей минуты):
puts t.strftime('%Н:%М') # Печатается 22:07
puts (t+30).strftime('%Н:%М') # Печатается 22:08
Наконец, со стандартного 24-часового представления можно переключиться на 12-часовой формат, добавив признак перехода через полдень (АМ/РМ):
puts t.strftime('%I:%М %p') # Печатается 10:07 PM
Есть и другие возможности — поэкспериментируйте!
7.15 Сравнение моментов времени
К классу Time
подмешан модуль Comparable
, поэтому моменты времени можно сравнивать непосредственно:
t0 = Time.local(2000,11,10,22,15) # 10 Nov 2000 22:15
t1 = Time.local(2000,11,9,23,45) # 9 Nov 2000 23:45
t2 = Time.local(2000,11,12,8,10) # 12 Nov 2000 8:10
t3 = Time.local(2000,11,11,10,25) # 11 Nov 2000 10:25
if t0 < t1 then puts 't0 < t1' end
if t1 != t2 then puts 't1 != t2' end
if t1 <= t2 then puts 't1 <= t2' end
if t3.between?(t1,t2)
puts 't3 находится между t1 и t2'
end
# Все четыре предложения if возвращают true.
7.16 Прибавление интервала к моменту времени
Можно получить новый момент времени, прибавив к существующему интервал. Последний представляется целым числом, которое интерпретируется как число секунд.
t0 = Time.now
t1 = t0 + 60 # Ровно одна минута с момента t0.
t2 = t0 + 3600 # Ровно один час с момента t0.
t3 = t0 + 86400 # Ровно один день с момента t0.
Может пригодиться функция dhms2sec
(определена в разделе 7.6). Напомним, что по умолчанию параметры, соответствующие часам, минутам и секундам, равны 0.
t4 = t0 + dhms2sec(5,10) # 5 дней, 10 часов в будущем.
t5 = t0 + dhms2sec(22,18,15) # 22 дня, 18 часов, 15 минут в будущем.
t6 = t0 - dhms2sec(7) # Ровно неделю назад.
Не забывайте, что для получения момента времени в прошлом нужно вычитать, как при вычислении t6
в примере выше.
7.17. Вычисление разности между двумя моментами времени
Можно вычислить интервал между двумя моментами времени. В результате вычитания одного объекта Time
из другого получаем число секунд:
today = Time.local(2000,11,10)
yesterday = Time.local(2000,11,9)
cliff = today - yesterday # 86400 секунд.
И снова оказывается полезной функция sec2dhms
, которая определена в разделе 7.6.
past = Time. Local(1998,9,13,4,15)
now = Time.local(2000,11,10,22,42)
diff = now - past unit = sec2dhms(diff)
puts '#{unit[0]} дней,' # 789 дней,
puts '#{unit[1]} часов,' # 18 часов,
puts '#{unit[2]} минут' # 27 минут
puts 'и #{unit[3]} секунд.' # и 0 секунд.
7.18. Работа с конкретными датами (до точки отсчета)
В стандартной библиотеке Date
есть одноименный класс для работы с датами, предшествующими полуночи 1 января 1970 года.
Несмотря на некоторое перекрытие с классом Time
, между ними есть существенные