91 votes

Soustraction de la date de Ruby (par exemple, il y a 90 jours)

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

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

J'essaie de faire la même chose en Ruby, mais je

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

Cependant, le calcul est erroné ici (je travaille vraiment avec des dates à minuit).

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

110voto

Matt Points 6779
require 'date'
now = Date.today
ninety_days_ago = (now - 90)

En passant par la console IRB, j'obtiens.. :

>>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 vous avez besoin de temps, vous pouvez simplement dire now = DateTime.now

0 votes

Votre message original, pré-édité, était plus proche de ce dont j'avais besoin, mais Date.Now était protégé. Date.today fonctionnait. Si vous modifiez votre premier texte pour avoir la ligne now = Date.today, je l'accepterai.

3 votes

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

0 votes

@EstebanFeldman Date autorise également les fractions, ce qui vous permet de faire Date.today - (90.0/24.0) . Le résultat peut facilement être converti to_datetime ou to_time aussi.

16voto

Abdo Points 3360

Pour ceux qui utilisent Rails, consultez ce qui suit :

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

10voto

Si vous utilisez Rails ou si cela ne vous dérange pas d'inclure ActiveSupport, vous pouvez utiliser la fonction Numérique#jours DSL comme ça :

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 

Puisque vous travaillez avec des dates au lieu d'heures, vous devriez également commencer avec des instances de date, ou convertir vos intances DateTime avec #to_date. Lorsque vous ajoutez/soustrayez des nombres à des 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)>

5voto

bigtunacan Points 1121

C'est un très vieux post, mais si vous voulez rester dans le coup Time comme cela avait été demandé à l'origine, plutôt que de passer à un objet de type Date vous pouvez envisager d'utiliser Ruby Facets .

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

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

En exigeant des Facettes, vous pouvez alors faire ce qui suit avec les objets Temps.

Time.now.less(90, :days)

0 votes

Ce projet n'a pas été mis à jour depuis deux ans et a ouvert des questions avec un seul commentaire. Il est mort.

0 votes

@user4674453 La dernière mise à jour date de 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".

1voto

methyl Points 1419

Essayez chronique

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X