Ruby:
Расчет даты в будущем или прошлом
Как это сделать:
Ruby делает работу с датами очень удобной с помощью встроенного класса Date
и дополнительной библиотеки active_support
для некоторых удобных функций. Вот как это делается:
require 'date'
require 'active_support/core_ext/integer'
# Получаем сегодняшнюю дату
today = Date.today
puts "Сегодня: #{today}"
# Рассчитываем дату через 10 дней
future_date = today + 10
puts "Через 10 дней будет: #{future_date}"
# Рассчитываем дату 30 дней назад
past_date = today - 30
puts "30 дней назад было: #{past_date}"
# Более сложные расчеты с active_support
puts "Через 2 месяца будет: #{2.months.from_now.to_date}"
puts "100 дней назад было: #{100.days.ago.to_date}"
Пример вывода:
Сегодня: 2023-04-07
Через 10 дней будет: 2023-04-17
30 дней назад было: 2023-03-08
Через 2 месяца будет: 2023-06-07
100 дней назад было: 2022-12-28
Подробно
До того, как Ruby включил функциональность расчета дат в свои стандартные и дополнительные библиотеки, разработчикам часто приходилось вручную рассчитывать даты, учитывая високосные годы, разную длину месяцев и часовые пояса — довольно большая головная боль.
Стандартный класс Date
делает многое “из коробки”. Вы можете легко добавить (+
) или вычесть (-
) дни. Однако, для более интуитивного манипулирования временными периодами, например, “через 2 месяца”, мы полагаемся на active_support
, извлеченный из Ruby on Rails. Эта библиотека использует расширения для стандартных классов Ruby, делая такие расчеты удобными для восприятия.
При расчете прошлых или будущих дат учитывайте часовые пояса, если вы также учитываете время (объекты DateTime
или Time
). Класс Time
Ruby и active_support
могут с этим справиться, но требуют немного больше настройки.
Существуют альтернативы, такие как библиотеки time-lord
и ice_cube
, которые предлагают больше синтаксического сахара или специализированные функции (например, повторяющиеся события) соответственно.
Смотрите также
- Работа с часовыми поясами в Ruby: https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
- Библиотека ’time-lord’ для более человекопонятных выражений: https://github.com/krainboltgreene/time-lord
- Библиотека ‘ice_cube’ для работы с повторяющимися событиями: https://github.com/seejohnrun/ice_cube