Ruby Tarih Çıkarma (ör. 90 gün önce)


89

Şu joda-time API'si beni biraz şımarttı:

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

Ruby'de benzer bir şey yapmaya çalışıyorum ama ben

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

Ancak, matematik burada değil (gerçekten gece yarısı tarihlerle çalışıyorum).

Tarih çıkarma için uygun API var mı?

Yanıtlar:


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

Bunu IRB konsolu aracılığıyla çalıştırıyorum:

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

Zamana ihtiyacın varsa sadece söyleyebilirsin now = DateTime.now


Orijinal gönderiniz, ön düzenleme ihtiyacım olana yakındı, ancak Date.Now korumalıydı. Date.today çalıştı. Şimdi = Date.today satırına sahip olmak için ilk tanıtımınızı değiştirirseniz, kabul ederim.
darthtrevino

3
@Matt: ve günler yerine 90 saat nasıl çıkarılır?
Esteban Feldman

@EstebanFeldman Dateayrıca kesirlere izin verir, böylece yapabilirsiniz Date.today - (90.0/24.0). Sonuç kolayca dönüştürülebilir to_datetimeya to_timeda.
jchook

15

Rails kullananlar için aşağıdakilere göz atın:

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 kullanıyorsanız veya ActiveSupport'u dahil etmek için sorun yoksa, Numeric # days DSL'i şu şekilde kullanabilirsiniz :

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 

Zamanlar yerine tarihlerle çalıştığınız için, ya Tarih örnekleriyle başlamalı ya da DateTime tutarsızlıklarınızı #to_date ile dönüştürmelisiniz. Tarih örneklerinden sayı eklerken / çıkarırken, sayılar örtük olarak günlerdir.

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'nin standart kitaplığının bir parçası olan Date ve DateTime sınıflarında tarih aritmetiğini destekler . Bu sınıfların her ikisi de , bir tarihe veya saate gün ekleyen ve bunları çıkaran # + ve # - yöntemlerini ortaya çıkarır.

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

Günler yerine aylarda çalışmak için # << ve # >> yöntemlerini kullanın. Aylardaki aritmetik, günlerdeki aritmetikten biraz farklıdır. DateTime yerine Date kullanımı, etkiyi daha belirgin hale getirir.

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

Joda-time örneğinizi takiben, Ruby'de buna benzer bir şey yazabilirsiniz.

now =  DateTime.now
ninety_days_ago = now - 90

ya da belki sadece

ninety_days_ago = DateTime.now - 90

5

Bu çok eski bir gönderi, ancak bir Timenesneye geçmek yerine, ilk başta sorulduğu gibi bir nesneye devam Dateetmek istiyorsanız, kullanmayı düşünmek isteyebilirsiniz Ruby Facets.

Ruby Facets, çekirdek Ruby sınıfları için standartlaştırılmış bir uzantı kitaplığıdır.

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

Facets'i zorunlu kılarak, Time nesneleriyle aşağıdakileri yapabilirsiniz.

Time.now.less(90, :days)


Bu proje iki yıldır güncellenmedi ve tek bir yorumla sorunlar açtı. Öldü.
user4674453

@ user4674453 Son güncelleme altı ay önceydi. Hala Ruby'nin en son sürümüyle çalışan kararlı bir kitaplıktır. "Ölü" olarak kabul edilmemek için tüm kod tabanlarının günlük olarak güncellenmesi gerekmez.
bigtunacan

5

saniye sayısını kullanın:

Time.now - 90*24*60*60

-1

Basit çözüm:

days90_ago = 90.days.ago.to_date.to_s

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

Bu ActiveSupport (Rails) kullanıyor.
Espen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.