RubyでDateTimeの時刻部分を設定する


104

たとえば、datetimeオブジェクトがあるとしますDateTime.now。時間と分を0(真夜中)に設定します。どうやってやるの?

回答:


220

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

26
FWIW、変更方法はルビーではなくレールの一部です。時間オプション(時間、分、秒)が0にのみ時間は、その後分と秒時間と分が渡された場合、次に秒がセットされて0に設定され、渡されたもしそうであれば、縦続リセット
アンナ

1
DateTime.now.midnightは期待どおりに24:00:00を返さないことに注意してください。これは00:00:00を返します-begin_of_dayと同じ値です。これがいくつかのシナリオでなぜ重要であるかについての私の答えを見てください。
rmcsharry

1
最初の純粋なルビーソリューションはタイムゾーン情報をドロップしますが、2番目はタイムゾーン情報をドロップしません
Tony

1
タイムゾーンを考慮して回答を更新し、2番目のバリエーションを置き換えました。@Tonyは非常に優れた漁獲量であり、実際にはどちらもタイムゾーン情報の損失の影響を受けやすくなっています。 DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
アショダ2016

TIMEZONE:引数ハッシュのキーワードオフセットによって変更できます:DateTime.now.change({時:0、分:0、秒:0オフセット: '+02:00'})
Ekkstein

34

気にしないで、それを得た。新しいDateTimeを作成する必要があります:

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)

6
いい答えだ。これらのゼロは、HOUR、MINUTE、SECOND、OFFSET(タイムゾーン)の順に表されていることを追加したかっただけです。
d_ethier 2013

3
これを機能させるのに失敗した後、私はそれを学びました: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0)それは機能します。
Ekkstein、2014

2
忘れないでください: now = DateTime.now
2015年

1
また、最後の引数は整数ではなくMSTのタイムゾーンeg( "-0700")の文字列である必要があることにも注意してください
Donavan White

2
過去の日付を扱っているのでない限り、使用しないでくださいDateTime。イギリスのように夏時間のある国に住んでいると、迷惑な問題が発生します。こちらの説明をご覧ください。gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

警告DateTime.now.midnightそしてDateTime.now.beginning_of_day、同じ値を返します(これは、当日のゼロ時間です-真夜中は、その名前から予想されるように24:00:00を返しません)。

だから、私はこれを、受け入れられた回答を使用して将来の真夜中x日を計算する可能性がある人のための詳細情報として追加します。

たとえば、14日目の真夜中に期限切れになる14日間の無料トライアル:

DateTime.now.midnight + 14.days

14日目の朝です。これは13.x日トライアルに相当します(xは残りの日の一部です。今が正午である場合、13.5日トライアルです)。

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

DateTime.now.midnight + 15.days

14日目は真夜中です。

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


1

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

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

この答えが正しいとマークされている理由はわかりません。それは本当に質問に答えません。文字列を日付に解析する方法を知っています。しかし、特定の日付インスタンスの特定の部分を変更する方法を知りたいのですが。たとえば年。何か案は?Javaでは、1年間だけセッターを使用します。しかし、Rubyでは機能しません:-(
Robert Reiz 2013

1
私はもう慢性宝石を信用していません。それは本当に時代遅れです。アプリで実行時に日時を解析する際に問題が発生し、ビジネスが失われました。
Vijay Meena、2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.