Sottrazione data rubino (ad es. 90 giorni fa)


88

Sono stato un po 'viziato dall'API joda-time di:

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

Sto cercando di fare una cosa simile in Ruby, ma lo sono

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

Tuttavia, la matematica non è qui (sto davvero lavorando con le date a mezzanotte).

Esiste un'API amichevole per la sottrazione di date?

Risposte:


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

Eseguendolo attraverso la console IRB ottengo:

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

Se hai bisogno di tempo potresti semplicemente dire now = DateTime.now


Il tuo post originale, pre-modifica, era più vicino a ciò di cui avevo bisogno, ma Date.Now era protetto. Date.today lavorato. Se modifichi il tuo primo blurb per avere la riga now = Date.today, lo accetto.
darthtrevino

3
@ Matt: e come sottrarre 90 ore invece di giorni?
Esteban Feldman

@EstebanFeldman Dateconsente anche le frazioni, quindi puoi farlo Date.today - (90.0/24.0). Il risultato può essere facilmente convertito to_datetimeo to_timeanche.
jchook

15

Per coloro che utilizzano Rails, controlla quanto segue:

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

Se stai usando Rails o non ti dispiace includere ActiveSupport, puoi usare il DSL numerico # giorni in questo modo:

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 

Poiché stai lavorando con le date anziché con le ore, dovresti anche iniziare con le istanze di Date o convertire le tue intance DateTime con #to_date. Quando si aggiungono / sottraggono numeri dalle istanze di data, i numeri sono implicitamente giorni.

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 supporta l'aritmetica della data nelle classi Date e DateTime , che fanno parte della libreria standard di Ruby. Entrambe queste classi espongono i metodi # + e # - , che aggiungono e sottraggono giorni da una data o un'ora.

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

Usa i metodi # << e # >> per operare sui mesi invece che sui giorni. L'aritmetica sui mesi è leggermente diversa dall'aritmetica sui giorni. L'utilizzo di Date invece di DateTime rende l'effetto più evidente.

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

Seguendo il tuo esempio joda-time, potresti scrivere qualcosa del genere in Ruby.

now =  DateTime.now
ninety_days_ago = now - 90

o forse solo

ninety_days_ago = DateTime.now - 90

5

Questo è un post super vecchio, ma se vuoi restare con un Timeoggetto, come è stato originariamente chiesto, piuttosto che passare a un Dateoggetto potresti prendere in considerazione l'utilizzo Ruby Facets.

Ruby Facets è una libreria standardizzata di estensioni per le classi principali di Ruby.

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

Richiedendo Facet è quindi possibile eseguire le seguenti operazioni con gli oggetti Time.

Time.now.less(90, :days)


Questo progetto non è stato aggiornato da due anni e ha aperto problemi con un solo commento. È morto.
user4674453

@ user4674453 L'ultimo aggiornamento risale a sei mesi fa. È una libreria stabile che funziona ancora con l'ultima versione di Ruby. Non tutte le basi di codici devono essere aggiornate quotidianamente per non essere considerate "morte".
bigtunacan

5

usa il numero di secondi:

Time.now - 90*24*60*60

-1

Soluzione semplice:

days90_ago = 90.days.ago.to_date.to_s

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

Questo sta usando ActiveSupport (Rails).
Espen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.