私はjoda-time APIに少し甘やかされてきました:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Rubyで同様のことをしようとしていますが、
now = Time.now
ninetyDaysAgo = now - (90*24)
ただし、数学はここではオフになっています(私は真夜中に日付を処理しています)。
日付減算のためのフレンドリーなAPIはありますか?
回答:
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
では分数も許可されるため、実行できますDate.today - (90.0/24.0)
。結果も簡単に変換to_datetime
できto_time
ます。
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)>
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
これは非常に古い投稿ですがTime
、Date
オブジェクトに切り替えるのではなく、最初に尋ねられたようにオブジェクトを保持したい場合は、使用を検討することができますRuby Facets
。
Ruby Facetsは、コアRubyクラスの拡張機能の標準ライブラリです。
http://rubyworks.github.io/facets/
ファセットを要求することにより、Timeオブジェクトを使用して以下を実行できます。
Time.now.less(90, :days)