Третью возможность предоставляет класс Date
. В нем имеется метод доступа cweek
, который возвращает порядковый номер недели, следуя определению из стандарта ISO 8601 (согласно которому первой считается неделя, содержащая первый вторник года).
Если все это вам не подходит, можете придумать собственный алгоритм. Все три решения включены в один фрагмент кода:
require "date"
# Посмотрим, в какую неделю попадает 1 мая в 2002 и 2005 годах.
t1 = Time.local(2002,5,1)
d1 = Date.new(2002,5,1)
week1a = t1.strftime("%U").to_i # 17
week1b = t1.strftime("%W").to_i # 17
week1c = d1.cweek #18
t2 = Time.local(2005,5,1)
d2 = Date.new(2005,5,1)
week2a = t2.strftime("%U").to_i # 18
week2b = t2.strftime("%W").to_i # 18
week2c = d2.cweek # 17
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.
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
в примере выше.
Читать дальше
Конец ознакомительного отрывка
Купить книгу