Установить временную часть DateTime в рубине

Скажем, у меня есть объект datetime, например DateTime.now. Я хочу установить часы и минуты на 0 (полночь). Как я могу это сделать?

Ответ 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. Использование полуночи может вводить в заблуждение/неправильно понимать.