2011-03-02 47 views
68

He estado un poco estropeado por la API en tiempo de joda:Rubí resta de fechas (por ejemplo Hace 90 días)

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

que estoy tratando de hacer algo similar en Ruby, pero estoy

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

Sin embargo, las matemáticas están aquí (realmente estoy trabajando con las fechas a la medianoche).

¿Hay una API amigable para la resta de fecha?

Respuesta

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

La ejecución de este a través de la consola IRB consigo:

>>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 necesita el tiempo que podría simplemente decir now = DateTime.now

+0

su puesto original, edición previa estaba más cerca de lo que necesitaba, pero Date.Now estaba protegida. Fecha.today trabajado. Si cambias tu primer anuncio publicitario para tener la línea ahora = Date.today, lo aceptaré. – darthtrevino

+0

@darthtrevino: publicación actualizada. – Matt

+3

@Matt: ¿y cómo restar 90 horas en lugar de días? –

9

Si está usando Rails o don' Para la mente, incluido ActiveSupport, puede usar la DSL Numeric#days de la siguiente manera:

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 

Dado que está trabajando con fechas en vez de veces, también debe comenzar con las instancias de Fecha o convertir las fechas de Fecha con # a la fecha. Al sumar/restar números de instancias de fecha, los números son implícitamente días.

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

Para aquellos que utilizan los carriles, revisa el siguiente:

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 
+3

eso es 90.days.ago –

+0

eso es gracioso :-) – Abdo

5

Este es un puesto muy antigua, pero si quería mantener con un objeto Time, como fue publicada originalmente, en lugar de cambiar a un objeto Date que quizás desee considerar usando Ruby Facets.

Ruby Facets es una biblioteca estandarizada de extensiones para las clases principales de Ruby.

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

Al exigir Facetas A continuación, puede hacer lo siguiente con objetos de tiempo.

Time.now.less(90, :days)

7

Rubí apoya la aritmética de fechas en el Date and DateTime classes, que son parte de la biblioteca estándar de Ruby. Ambas clases exponen los métodos #+ y #-, que suman y restan días de una fecha o una hora.

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

utilizar los métodos #<< y #>> para operar en meses en lugar de días. La aritmética en meses es un poco diferente a la aritmética en días. Usar Date en lugar de DateTime hace que el efecto sea más obvio.

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

Siguiendo su ejemplo en tiempo joda, es posible escribir algo como esto en Ruby.

now = DateTime.now 
ninety_days_ago = now - 90 

o tal vez sólo

ninety_days_ago = DateTime.now - 90 
2

utiliza el número de segundos:

Time.now - 90*24*60*60 
Cuestiones relacionadas