Soustraction de date rubis (par exemple il y a 90 jours)


88

J'ai été un peu gâté par l'API joda-time de:

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

J'essaye de faire une chose similaire dans Ruby, mais je suis

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

Cependant, le calcul n'est pas ici (je travaille vraiment avec des dates à minuit).

Existe-t-il une API conviviale pour la soustraction de date?

Réponses:


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

En exécutant ceci via la console IRB, je reçois:

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

Si tu as besoin de temps tu peux juste dire now = DateTime.now


Votre message d'origine, la pré-édition était plus proche de ce dont j'avais besoin, mais Date.Now était protégé. Date.aujourd'hui a travaillé. Si vous modifiez votre premier texte de présentation pour avoir la ligne maintenant = Date.today, je l'accepterai.
darthtrevino

3
@Matt: et comment soustraire 90 heures au lieu de jours?
Esteban Feldman

@EstebanFeldman Dateautorise également les fractions, ce que vous pouvez faire Date.today - (90.0/24.0). Le résultat peut être facilement converti to_datetimeou to_timeaussi.
jchook

15

Pour ceux qui utilisent Rails, consultez les éléments suivants:

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

Si vous utilisez Rails ou que cela ne vous dérange pas d'inclure ActiveSupport, vous pouvez utiliser le DSL Numeric # days comme ceci:

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 

Étant donné que vous travaillez avec des dates au lieu d'heures, vous devez également commencer par des instances de date ou convertir vos intances DateTime avec #to_date. Lors de l'ajout / de la soustraction de nombres d'instances de date, les nombres sont implicitement des jours.

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 prend en charge l'arithmétique des dates dans les classes Date et DateTime , qui font partie de la bibliothèque standard de Ruby. Ces deux classes exposent les méthodes # + et # - , qui ajoutent et soustraient des jours à une date ou à une heure.

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

Utilisez les méthodes # << et # >> pour opérer sur des mois plutôt que sur des jours. L'arithmétique sur les mois est un peu différente de l'arithmétique sur les jours. L'utilisation de Date au lieu de DateTime rend l'effet plus évident.

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

En suivant votre exemple joda-time, vous pourriez écrire quelque chose comme ça en Ruby.

now =  DateTime.now
ninety_days_ago = now - 90

ou peut-être juste

ninety_days_ago = DateTime.now - 90

5

C'est un article très ancien, mais si vous vouliez conserver un Timeobjet, comme cela a été demandé à l'origine, plutôt que de passer à un Dateobjet, vous voudrez peut-être envisager d'utiliser Ruby Facets.

Ruby Facets est une bibliothèque standardisée d'extensions pour les classes Ruby principales.

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

En demandant des facettes, vous pouvez alors effectuer les opérations suivantes avec des objets Time.

Time.now.less(90, :days)


Ce projet n'a pas été mis à jour depuis deux ans et a ouvert des problèmes avec un seul commentaire. C'est mort.
user4674453

@ user4674453 La dernière mise à jour remonte à six mois. C'est une bibliothèque stable qui fonctionne toujours avec la dernière version de Ruby. Toutes les bases de code n'ont pas besoin d'être mises à jour quotidiennement pour ne pas être considérées comme «mortes».
bigtunacan

5

utilisez le nombre de secondes:

Time.now - 90*24*60*60

-1

Solution simple:

days90_ago = 90.days.ago.to_date.to_s

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

Ceci utilise ActiveSupport (Rails).
Espen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.