2012-03-05 14 views
7

Estoy tratando de hacer una fecha matemática basada en el número de semana de un año determinado. Por ejemplo:Encontrar la fecha para un número de semana dado

date = Date.today # Monday, March 5, 2012 
puts date.cwyear # 2012 
puts date.cweek # 10 (10th week of 2012) 

Ahora que sé lo que es la semana en curso, quiero averiguar lo que la próxima semana y la anterior son. Necesito tomar el año (2012) y el número de semana (10) y convertirlo en un objeto de fecha para poder calcular el valor para la semana siguiente/anterior. ¿Cómo puedo hacer esto?

+0

¿Es esto en rieles/¿Se puede utilizar ActiveSupport? Proporciona algunos buenos ayudantes de fecha para cosas como esta. Además, por "semana siguiente y anterior" ¿se refiere exactamente a los siete días posteriores a la 'fecha' o al comienzo de esas semanas? –

+0

esta es una aplicación Sinatra, pero si ActiveSupport proporciona las características para poder hacer esto, y puedo usarla con una aplicación Sinatra, estaría dispuesto a usarla. – Andrew

Respuesta

14

¿Quieres Date.commercial :

require 'date' 
now = Date.today           #=> 2012-03-05 
monday_next_week = Date.commercial(now.cwyear,now.cweek+1) #=> 2012-03-12 
next_sunday_or_today = monday_next_week - 1    #=> 2012-03-11 

Tenga en cuenta que las semanas comienzan el lunes, por lo que si está en domingo y pide el próximo lunes - 1 año Tendrás el mismo día.

Tenga en cuenta también que si no desea que los lunes también puede especificar el número de días en el método:

thursday_next_week = Date.commercial(now.cwyear,now.cweek+1,4) #=> 2012-03-15 
+0

¡increíble! ¡gracias! – Andrew

+0

@Andrew [De nada] (http://meta.stackexchange.com/a/5235/153741) :) – Phrogz

+3

esto no funciona para 53 semana – Thorin

3

Cálculo por día es bastante simple con Date objetos. Si lo que desea es obtener la semana anterior/siguiente de una Date objeto dado utilizar lo siguiente:

date = Date.today 
previous_week = (date - 7).cweek 
next_week = (date + 7).cweek 
+1

+1 Nunca entendí esos ActiveSupport cheapo's. – steenslag

+0

Eso parece prometedor. Ahora, ¿cómo inicializaría un nuevo objeto de fecha de una semana y año determinados (es decir, no esta semana)? – Andrew

+0

@steenslag Es algo a lo que a menudo te acostumbras (especialmente si la mayoría del trabajo de Ruby (Fecha) es con Rails). No es muy diferente de estar acostumbrado a tener 'inyectar' en Ruby y luego ir a Java y tienes que escribirlo tú mismo, es solo otra biblioteca común. Estoy a favor de usar Ruby core antes de una dependencia, pero si ya tienes ActiveSupport, ¿por qué no usarlo? –

0

Suponiendo que quiere decir "un número determinado semana en el año en curso", puede hacer lo siguiente:

2.weeks.since (Time.gm (Time.now.year)) => Vie Ene 15 00:00:00 GMT 2010 suplente (WEEK_NUMBER - 1) para el 1 de lo anterior, y obtendrás una fecha en la semana deseada.

0

que han creado algunos métodos para obtener el número de semanas de una determinada fecha algo como esto:

def self.get_week(date) 
    year = date.year 
    first_monday_of_the_year = self.get_first_monday_of_the_year(year) 
    # The first days of January may belong to the previous year! 
    if date < first_monday_of_the_year 
     year -= 1 
     first_monday_of_the_year = self.get_first_monday_of_the_year(year) 
    end 
    day_difference = date - first_monday_of_the_year 
    week = (day_difference/7).to_i + 1 
    week 
    end 

    def self.get_monday_of_year_week(year, week) 
    d = self.get_first_monday_of_the_year(year) 
    d + ((week - 1) * 7).days 
    end 

    def self.get_first_monday_of_the_year(year) 
    d = Date.new(year, 1, 7) # 7 Jan is always in the first week 
    self.get_monday_of_week(d) 
    end 

    def self.get_monday_of_week(date) 
    wday = (date.wday + 6) % 7 
    date - wday.days 
    end 
Cuestiones relacionadas