Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Ruby.docx
Скачиваний:
19
Добавлен:
06.09.2019
Размер:
1.74 Mб
Скачать

7.12. Проверка года на високосность

В классе Date есть два метода класса julian_leap? и gregorian_leap?, но только последний применим к относительно недавнему времени. Есть также метод leap?, но это просто синонимgregorian_leap?.

require "date"

flag1 = Date.julian_leap? 1700    # true

flag2 = Date.gregorian_leap? 1700 # false

flag3 = Date.leap? 1700           # false

Любой ребенок знает первое правило проверки на високосность: год должен делиться на 4. Меньшее число людей знают второе правило: год не должен делиться на 100. И уж совсем немногие знают про исключение из второго правила: если год делится на 400, то он високосный. Таким образом, последний год тысячелетия является високосным, только если делится на 400; так, 1900 год не был високосным, а 2000 был. (Эта поправка необходима, потому что в году не ровно 365.25 дней, а приблизительно 365.2422.)

В классе Time нет аналогичного метода, но при желании его легко можно добавить.

class Time

 def Time.leap? Year

  if year % 400 == 0

   true

  elsif year % 100 == 0

   false

  elsif year % 4 == 0

   true

  else

   false

 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.