簡體   English   中英

Ruby 日期減法(例如 90 天前)

[英]Ruby Date Subtraction (e.g. 90 days Ago)

我被 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

對於那些使用 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

如果您使用 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 支持Date 和 DateTime 類中的日期算術,它們是 Ruby 標准庫的一部分。 這兩個類都公開了#+#-方法,它們在日期或時間中添加和減去天數。

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

使用#<<#>>方法對月而不是天進行操作。 月份的算術與天的算術略有不同。 用Date代替DateTime,效果更明顯。

 > (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

這是一篇非常古老的帖子,但是如果您想保留Time對象,就像最初要求的那樣,而不是切換到Date對象,您可能需要考慮使用Ruby Facets

Ruby Facets 是核心 Ruby 類的標准化擴展庫。

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

通過要求 Facets,您可以對 Time 對象執行以下操作。

Time.now.less(90, :days)

簡單的解決方案:

days90_ago = 90.days.ago.to_date.to_s

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM