Скажем, у меня есть объект datetime, например DateTime.now
. Я хочу установить часы и минуты на 0 (полночь). Как я могу это сделать?
Установить временную часть DateTime в рубине
Ответ 1
В среде Rails:
Благодаря ActiveSupport вы можете использовать:
DateTime.now.midnight
DateTime.now.beginning_of_day
ИЛИ
DateTime.now.change({ hour: 0, min: 0, sec: 0 })
# More concisely
DateTime.now.change({ hour: 0 })
В пределах чисто среды Ruby:
now = DateTime.now
DateTime.new(now.year, now.month, now.day, 0, 0, 0, now.zone)
ИЛИ
now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))
Ответ 2
Nevermind, понял. Необходимо создать новую DateTime:
DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
Ответ 3
Если вы используете его часто, подумайте об установке этого драгоценного камня, чтобы улучшить синтаксический анализ даты:
https://github.com/mojombo/chronic
require 'chronic'
Chronic.parse('this 0:00')
Ответ 4
Предупреждение: DateTime.now.midnight
и DateTime.now.beginning_of_day
вернуть одно и то же значение (это нулевой час текущего дня - полночь не возвращается 24:00:00, как и следовало ожидать от его имени).
Итак, я добавляю это как дополнительную информацию для тех, кто может использовать принятый ответ для вычисления полуночи x дней в будущем.
Например, 14-дневная бесплатная пробная версия, которая должна истечь в полночь на 14-й день:
DateTime.now.midnight + 14.days
- это утро 14-го дня, что эквивалентно 13-дневному испытанию (x - часть дня, оставшегося до конца - если сейчас полдень, то это 13,5-дневная пробная версия).
Вам действительно нужно это сделать:
DateTime.now.midnight + 15.days
чтобы получить полночь на 14-й день.
По этой причине я всегда предпочитаю использовать beginning_of_day
, так как это 00:00:00. Использование полуночи может вводить в заблуждение/неправильно понимать.