Rubyの日付減算(例:90日前)


88

私はjoda-time APIに少し甘やかされてきました:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

Rubyで同様のことをしようとしていますが、

now = Time.now
ninetyDaysAgo = now - (90*24)

ただし、数学はここではオフになっています(私は真夜中に日付を処理しています)。

日付減算のためのフレンドリーなAPIはありますか?

回答:


103
require 'date'
now = Date.today
ninety_days_ago = (now - 90)

私が得るIRBコンソールを通してこれを実行する:

>>require 'date'
now = Date.today
ninety_days_ago = (now - 90)

require 'date'
=> false
now = Date.today
=> #<Date: 2011-03-02 (4911245/2,0,2299161)>
ninety_days_ago = (now - 90)
=> #<Date: 2010-12-02 (4911065/2,0,2299161)>

あなたが時間を必要とするなら、あなたはただ言うことができます now = DateTime.now


元の投稿、事前編集は私が必要としていたものに近かったが、Date.Nowは保護されていた。Date.todayが機能しました。最初の言い回しを変更して、現在の行が= Date.todayになるように変更すると、受け入れられます。
darthtrevino 2011年

3
@マット:そして、日ではなく90時間を引く方法は?
Esteban Feldman、2012

@EstebanFeldman Dateでは分数も許可されるため、実行できますDate.today - (90.0/24.0)。結果も簡単に変換to_datetimeできto_timeます。
jchook 2013年

15

Railsを使用している場合は、以下を確認してください。

DateTime.now - 10.days
=> Sat, 04 May 2013 12:12:07 +0300

20.days.ago - 10.days
=> Sun, 14 Apr 2013 09:12:13 UTC +00:00

10

Railsを使用している場合、またはActiveSupportを含めても構わない場合は、次のようにNumeric#days DSLを使用できます。

ruby-1.9.2-p136 :002 > Date.today
 => Wed, 02 Mar 2011 
ruby-1.9.2-p136 :003 > Date.today - 90.days
 => Thu, 02 Dec 2010 

時間ではなく日付で作業しているため、Dateインスタンスで開始するか、#to_dateでDateTimeインスタンスを変換する必要があります。日付インスタンスから数値を加算/減算する場合、数値は暗黙的に日数になります。

ruby-1.9.2-p136 :016 > DateTime.now.to_date
 => #<Date: 2011-03-02 (4911245/2,0,2299161)> 
ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90
 => #<Date: 2010-12-02 (4911065/2,0,2299161)> 

8

Rubyは、Rubyの標準ライブラリの一部であるDateクラスとDateTimeクラスの日付演算をサポートしています。これらのクラスはどちらも、日付または時刻から日数を加算および減算する#+および#-メソッドを公開しています。

$ irb
 > require 'date'
 => true 
 > (DateTime.new(2015,4,1) - 90).to_s  # Apr 1, 2015 - 90 days
 => "2015-01-01T00:00:00+00:00"
 > (DateTime.new(2015,4,1) - 1).to_s   # Apr 1, 2015 - 1 day
 => "2015-03-31T00:00:00+00:00" 

#<<および#>>メソッドを使用して、日ではなく月で操作します。月の算術は、日の算術とは少し異なります。DateTimeの代わりにDateを使用すると、効果がより明確になります。

 > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

joda-timeの例に従って、Rubyで次のようなものを書くことができます。

now =  DateTime.now
ninety_days_ago = now - 90

または多分ちょうど

ninety_days_ago = DateTime.now - 90

5

これは非常に古い投稿ですがTimeDateオブジェクトに切り替えるのではなく、最初に尋ねられたようにオブジェクトを保持したい場合は、使用を検討することができますRuby Facets

Ruby Facetsは、コアRubyクラスの拡張機能の標準ライブラリです。

http://rubyworks.github.io/facets/

ファセットを要求することにより、Timeオブジェクトを使用して以下を実行できます。

Time.now.less(90, :days)


このプロジェクトは2年間更新されておらず、1つのコメントで問題が発生しています。死んだ。
user4674453 2018

@ user4674453最後の更新は6か月前でした。Rubyの最新バージョンでも動作する安定したライブラリです。「デッド」と見なされないようにするために、すべてのコードベースを毎日更新する必要はありません。
bigtunacan 2018


-1

簡単な解決策:

days90_ago = 90.days.ago.to_date.to_s

OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07

これはActiveSupport(Rails)を使用しています。
エスペン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.