Правильная работа с датой и временем в Ruby on Rails
Итак, первое и самое важное — что есть время, которым мы оперируем в повседневности и из чего оно состоит?
В обычной жизни мы оперируем некоторым локальным временем, которое действует там, где мы живём, однако, в компьютерных системах с ним работать сложно и опасно — из-за перевода часов (летнее время, госдума и т.п.) оно неравномерно и неоднозначно (подробнее об этом позже). Поэтому требуется некоторое универсальное время, которое обладает равномерностью и однозначностью (тут в статью врывается високосная секунда и всё портит, но о ней мы говорить не будем), одно значение которого отображает один и тот же момент времени в любой точке Земли (физики, молчать!) — единая точка отсчёта, её роль исполняет UTC — всемирное координированное время. А ещё нам потребуются часовые пояса (часовые зоны в современной терминологии), чтобы конвертировать локальное время в универсальное и наоборот.
...
В Ruby on Rails для работы с часовыми поясами предназначен класс ActiveSupport::TimeZone, поставляемый в составе библиотеки ActiveSupport из стандартной поставки Ruby on Rails. Он представляет собой обёртку вокруг гема tzinfo, который, в свою очередь, предоставляет ruby-интерфейс к tzdata. Он предоставляет методы для работы со временем, а также активно используется в расширенном ActiveSupport'ом классом Time из стандартной библиотеки Ruby для полноценной работы с часовыми поясами. Ну и в классе ActiveSupport::TimeWithZone из Ruby on Rails, который хранят в себе не только время со смещением, но и сам часовой пояс. Многие методы у часового пояса возвращают именно объекты ActiveSupport::TimeWithZone, но в большинстве случаев вы этого даже не почувствуете. В чём же состоит разница между этими двумя классами, написано в документации, и эту разницу полезно знать.
Итак, первое и самое важное — что есть время, которым мы оперируем в повседневности и из чего оно состоит?
В обычной жизни мы оперируем некоторым локальным временем, которое действует там, где мы живём, однако, в компьютерных системах с ним работать сложно и опасно — из-за перевода часов (летнее время, госдума и т.п.) оно неравномерно и неоднозначно (подробнее об этом позже). Поэтому требуется некоторое универсальное время, которое обладает равномерностью и однозначностью (тут в статью врывается високосная секунда и всё портит, но о ней мы говорить не будем), одно значение которого отображает один и тот же момент времени в любой точке Земли (физики, молчать!) — единая точка отсчёта, её роль исполняет UTC — всемирное координированное время. А ещё нам потребуются часовые пояса (часовые зоны в современной терминологии), чтобы конвертировать локальное время в универсальное и наоборот.
...
В Ruby on Rails для работы с часовыми поясами предназначен класс
ActiveSupport::TimeZone
, поставляемый в составе библиотекиActiveSupport
из стандартной поставки Ruby on Rails. Он представляет собой обёртку вокруг гема tzinfo, который, в свою очередь, предоставляет ruby-интерфейс к tzdata. Он предоставляет методы для работы со временем, а также активно используется в расширенном ActiveSupport'ом классом Time из стандартной библиотеки Ruby для полноценной работы с часовыми поясами. Ну и в классеActiveSupport::TimeWithZone
из Ruby on Rails, который хранят в себе не только время со смещением, но и сам часовой пояс. Многие методы у часового пояса возвращают именно объектыActiveSupport::TimeWithZone
, но в большинстве случаев вы этого даже не почувствуете. В чём же состоит разница между этими двумя классами, написано в документации, и эту разницу полезно знать.Читать полностью »