Книга: Программирование на языке 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.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.325. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз