Книга: Программирование на языке Ruby
7.10. Контроль даты и времени
7.10. Контроль даты и времени
В разделе 7.5 было показано, что стандартные функции не проверяют корректность даты, а «переносят» ее вперед, если необходимо. Например, 31 ноября становится 1 декабря.
Иногда такое поведение даже желательно. А если нет, то спешу обрадовать: стандартная библиотека Date не считает такие даты правильными. Мы можем воспользоваться этим фактом для контроля переданной даты.
class Time
def Time.validate(year, month=1, day=1,
hour=0, min=0, sec=0, usec=0)
require "date"
begin
d = Date.new(year,month,day)
rescue
return nil
end
Time.local(year,month,day,hour,min,sec,usec)
end
end
t1 = Time.validate(2000,11,30) # Создается корректный объект.
t2 = Time.validate(2000,11,31) # Возвращается nil.
Здесь не мудрствуя лукаво мы просто возвращаем nil
, если переданные параметры не соответствуют правильной дате (полагаясь на вердикт, вынесенный классом Date
). Мы оформили этот метод как метод класса Time по аналогии с другими методами создания объектов.
Отметим, что класс Date
может работать и с датами, предшествующими точке отсчета, то есть дата 31 мая 1961 года с точки зрения этого класса вполне допустима. Но при попытке передать такие значения классу Time
возникнет исключение ArgumentError
. Мы не пытаемся его перехватить, полагая, что это лучше делать на том же уровне пользовательского кода, где обрабатывались бы исключения, скажем, от метода Time.local
.
Раз уж зашла речь о Time.local
, то отметим, что мы воспользовались именно этим методом. Захоти мы работать со временем по Гринвичу, нужно было бы вызывать метод gmt
. Лучше реализовать оба варианта.
- 7.1. Определение текущего момента времени
- 7.2. Работа с конкретными датами (после точки отсчета)
- 7.3. Определение дня недели
- 7.4. Определение даты Пасхи
- 7.5. Вычисление n-ого дня недели в месяце
- 7.6. Преобразование из секунд в более крупные единицы
- 7.7. Вычисление промежутка времени, прошедшего от точки отсчета
- 7.8. Високосные секунды
- 7.9. Определение порядкового номера дня в году
- 7.10. Контроль даты и времени
- 7.11. Определение недели в году
- 7.12. Проверка года на високосность
- 7.13. Определение часового пояса
- 7.14. Манипулирование временем без даты
- 7.15 Сравнение моментов времени
- 7.16 Прибавление интервала к моменту времени
- 7.17. Вычисление разности между двумя моментами времени
- 7.18. Работа с конкретными датами (до точки отсчета)
- 7.19. Взаимные преобразования объектов Date, Time и DateTime
- 7.20. Извлечение даты и времени из строки
- 7.21. Форматирование и печать даты и времени
- 7.22. Преобразование часовых поясов
- 7.23. Определение числа дней в месяце
- 7.24. Разбиение месяца на недели
- 7.25. Заключение
- 11 Исключение непроизводительных затрат времени
- 7.14. Манипулирование временем без даты
- 7.16 Прибавление интервала к моменту времени
- Уменьшение времени, необходимого для резервного копирования и восстановления
- Ограничение времени ожидания для транзакций (Lock timeout)
- 7.12. Объективизация времени
- Квант времени
- Контрольные вопросы
- Формула времени. Тайм-менеджмент на Outlook 2013
- Запуск сценариев на удаленных машинах. Контроль за ходом выполнения таких сценариев
- 12.6. Сигналы реального времени
- Время от времени оптическая мышь начинает мигать. Она сломалась?