Книга: Программирование на языке Ruby
7.19. Взаимные преобразования объектов Date, Time и DateTime
7.19. Взаимные преобразования объектов Date, Time и DateTime
В Ruby есть три основных класса для работы с датами и временем: Time
, Date
и DateTime
. Опишем их особенности:
• Класс Time
преимущественно обертывает соответствующие функции из стандартной библиотеки языка С. Они, как правило, опираются на точку отсчета в UNIX и потому не способны представлять моменты времени раньше 1970 года.
• Класс Date
создан для преодоления недостатков класса Time
. Он без труда справляется с датами в более отдаленном прошлом — например, позволяет представить день рождения Леонардо да Винчи (15 апреля 1452 года), и, кроме того, знает о реформе календаря. Но у него есть свои слабые места: он работает только с датами, игнорируя время.
• Класс DateTime
наследует Date
и пытается компенсировать отсутствующие в нем возможности. Он может представлять даты не хуже Date
и время не хуже Time
. Часто его способ представления даты и времени оказывается наилучшим.
Однако не думайте, что объект DateTime
— это просто объект Date
, к которому механически присоединен объект Time
. На самом деле в классе DateTime
отсутствуют такие методы, как usec
, dst?
и некоторые другие.
Итак, у нас есть три класса. К сожалению, не существует стандартного способа преобразовать один из них в любой другой. По мере развития Ruby подобные шероховатости будут устраняться. А пока обойдемся методами, приведенными в листинге 7.2. Спасибо Кирку Хейнсу (Kirk Haines).
Листинг 7.2. Преобразования между классами, представляющими даты и время
class Time
def to_date
Date.new(year, month, day)
rescue NameError
nil
end
def to_datetime
DateTime.new(year, month, day, hour, min, sec)
rescue NameError
nil
end
end
class DateTime
def to_time
Time.local(year,month,day,hour,min,sec)
end
end
class Date
def to_time
Time.local(year,month,day)
end
end
Эти методы пропускают наверх все исключения, кроме NameError
. Зачем нужно его перехватывать? Потому что могло случиться так, что программа не затребовала (с помощью директивы require
) библиотеку date
(напомним, что классы Date
и DateTime
входят в эту стандартную библиотеку, а не являются системными). В таком случае методы to_datetime
и to_date
возвращают nil
.
- 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. Заключение
- Creation date
- Иерархия объектов в InterBase
- Ограничение времени ожидания для транзакций (Lock timeout)
- Имена объектов длиной 68 символов
- Создание объектов Collection
- DEADLOCK TIMEOUT
- CONNECTION TIMEOUT
- Timestamp request
- Chapter 2 Building and Deploying a Run-Time Image
- 3.3. Определение объектов защиты
- 2.7 Преобразования типов
- DiskExplorer от Runtime Software