web-dev-qa-db-ja.com

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

次のjoda-time APIに少し甘やかされています。

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

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

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

ただし、ここでは計算がオフになっています(真夜中の日付を実際に処理しています)。

日付の減算に使いやすいAPIはありますか?

83
darthtrevino
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

95
Matt

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
12
Abdo

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

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.now - 90*24*60*60
5
Ruby

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

Rubyファセットは、コアRubyクラスの拡張機能の標準化されたライブラリです。

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

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

Time.now.less(90, :days)

4
bigtunacan