Последним проектом модуля 2 в Turing было создание приложения для электронной коммерции на Rails. Моя группа сделала еще один шаг вперед и создала сайт аренды, который, конечно же, требовал отслеживания бронирований, сроков выполнения, доступности и т. д. Поскольку наше приложение является приложением Rails, большая часть логики даты написана на Ruby, но при посещении корзины , общая стоимость корзины обновляется динамически в зависимости от выбранных дат резервирования, что делается с помощью JavaScript и JQuery, так что мне тоже было интересно изучать время в JavaScript, и здесь я отмечаю некоторые различия.
Диапазоны
На самом деле это относится и к другим вещам, кроме времени, но я нашел здесь первое применение. При проверке того, был ли товар в нашем магазине зарезервирован на дату, которую пытался сделать другой покупатель, мы просматривали все другие бронирования, уже связанные с этим товаром, и проверяли, включена ли предполагаемая новая дата начала резервирования в какую-либо дату. их. Для этого потребовался оператор ===, который я никогда раньше не использовал в Ruby — он проверяет включение в диапазон. Вот как это выглядит в pry и как мы его применили:
def range start_date.to_datetime..end_date.to_datetime end def self.reserved?(order) any? { |existing_order| existing_order.range === order.start_date } end
Строки для объектов времени
Когда пользователи запрашивают даты начала и окончания своего бронирования, они возвращаются в виде строк, которые выглядят примерно так: «10 марта 2016 г.», что бесполезно при создании объектов Time. К счастью, в Ruby есть встроенный модуль, который преобразует строки даты в их индекс, который затем можно использовать для создания объектов Time. Вот как:
Date::MONTHNAMES.index("November") # => 11 Date::MONTHNAMES[11] # => "November" Date::ABBR_MONTHNAMES.index("Nov") # => 11 Date::ABBR_MONTHNAMES[11] # => "Nov"
Аналогичный модуль существует и для DAYNAMES. Дни имеют нулевой индекс (воскресенье равно 0), а месяцы следуют более традиционному западному формату месяца, где их индекс — это номер месяца, который мы используем в датах (например, 3 марта).
- Примечание по Javascript. В отличие от Ruby, месяцы в Javascript нулевые (январь равен 0 и т. д.). Это сбивает с толку после того, как вы так привыкли к индексу месяцев, но, поскольку все в программировании индексируется с нуля, это имеет преимущество согласованности.
Вычитание времени
Чтобы узнать продолжительность резервирования, мы вычли дату начала из даты окончания. В Ruby это возвращает дробь вроде 10/1 для 10-дневного резервирования. С другой стороны, JavaScript возвращает разницу в миллисекундах. Чтобы получить количество дней, мы проделали эту радостную математику: returnValue / 24 / 60 / 60 / 1000, чтобы получить количество дней.
Вывод
В общем, я не находил время таким пугающим, как я думал. И в Ruby, и в JavaScript есть объекты времени, которые делают за вас большую часть тяжелой работы, если вы создаете их по мере необходимости с самого начала. При этом мне не нужно было беспокоиться о часовых поясах или других вещах, которые усложняют дело, и ставки ошибиться были довольно низкими.