web-dev-qa-db-ja.com

rubyでDateTimeの時間部分を設定します

たとえば、DateTime.now。時間と分を0(真夜中)に設定します。どうやってやるの?

93
Jesse Aldridge

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"))
203
ashoda

わかった、わかった。新しいDateTimeを作成する必要があります。

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
34
Jesse Aldridge

警告DateTime.now.midnightおよびDateTime.now.beginning_of_dayは同じ値を返します(これは現在の日のゼロアワーです-真夜中は、その名前から予想される24:00:00を返しません)。

そのため、受け入れられた回答を使用して将来の深夜x日を計算する可能性がある人のために、これを追加情報として追加しています。

たとえば、14日の午前0時に期限切れになる14日間の無料試用版:

DateTime.now.midnight + 14.days

は14日目の朝で、13.x日の試用期間に相当します(xは残りの日の一部です-正午であれば13.5日の試用期間です)。

実際にこれを行う必要があります:

DateTime.now.midnight + 15.days

14日目の真夜中を取得します。

このため、私は常にbeginning_of_day、これは00:00:00であるため。深夜を使用すると、誤解を招く/誤解される可能性があります。

4
rmcsharry

頻繁に使用する場合は、このgemをインストールして日付の解析を改善することを検討してください。

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')
2
wizztjh