Установить часть времени DateTime в рубине - PullRequest
92 голосов
/ 13 июня 2011

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

Ответы [ 4 ]

201 голосов
/ 28 января 2012

В среде Rails:

Благодаря ActiveSupport вы можете использовать:

DateTime.now.midnight
DateTime.now.beginning_of_day

OR

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)

OR

now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))
34 голосов
/ 13 июня 2011

Неважно, понял. Необходимо создать новый DateTime:

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
4 голосов
/ 13 апреля 2016

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

2 голосов
/ 13 июня 2011

Если вы используете его часто, рассмотрите возможность установки этого гема для улучшения разбора даты:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...