Последним проектом модуля 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 есть объекты времени, которые делают за вас большую часть тяжелой работы, если вы создаете их по мере необходимости с самого начала. При этом мне не нужно было беспокоиться о часовых поясах или других вещах, которые усложняют дело, и ставки ошибиться были довольно низкими.