ruby - septiembre - Rails 3.2.8-¿Cómo obtengo el número de semana de Rails?
semanas de mayo (4)
Me gustaría saber cómo obtener el número de la semana actual de Rails y cómo lo manipulo:
- Traducir el número de la semana en la fecha.
- Hacer un intervalo basado en el número de la semana.
Gracias.
Va a querer mantenerse alejado del strftime("%U")
de strftime("%U")
y "%W"
.
En su lugar, utilice Date.cweek
.
El problema es que, si alguna vez desea tomar un número de semana y convertirlo en una fecha, strftime
no le dará un valor que pueda transferir a Date.commercial
.
Date.commercial
espera un rango de valores que se basan en 1. Date.strftime("%U|%W")
devuelve un valor basado en 0. Pensarías que solo podrías +1 y estaría bien. El problema lo afectará al final de un año cuando haya 53 semanas. (Como lo que acaba de pasar ...)
Por ejemplo, veamos el final de diciembre de 2015 y los resultados de sus dos opciones para obtener un número de semana:
Date.parse("2015-12-31").strftime("%W") = 52
Date.parse("2015-12-31").cweek = 53
Ahora, veamos cómo convertir el número de esa semana en una fecha ...
Date.commercial(2015, 52, 1) = Mon, 21 Dec 2015
Date.commercial(2015, 53, 1) = Mon, 28 Dec 2015
Si ciegamente solo hace +1 en el valor que le pasa a Date.commercial
, terminará con una fecha no válida en otras situaciones:
Por ejemplo, diciembre de 2014:
Date.commercial(2014, 53, 1) = ArgumentError: invalid date
Si alguna vez tiene que convertir el número de esa semana en una fecha, la única manera segura es usar Date.cweek
.
Date#cweek
parece obtener el número de la semana ISO-8601 (una semana de lunes) como %V
en tiempo de actividad (mencionado por @Robban en un comentario).
Por ejemplo, el lunes y el domingo de la semana estoy escribiendo esto:
[ Date.new(2015, 7, 13), Date.new(2015, 7, 19) ].map { |date|
date.strftime("U: %U - W: %W - V: %V - cweek: #{date.cweek}")
}
# => ["U: 28 - W: 28 - V: 29 - cweek: 29", "U: 29 - W: 28 - V: 29 - cweek: 29"]
Utilice strftime
:
%U
- Número de semana del año. La semana comienza con el domingo. (00..53)
%W
- Número de semana del año. La semana comienza con el lunes. (00..53)
Time.now.strftime("%U").to_i # 43
# Or...
Date.today.strftime("%U").to_i # 43
Si desea agregar 43 semanas (o días, años, minutos, etc.) a una fecha, puede usar 43.weeks
, proporcionados por ActiveSupport:
irb(main):001:0> 43.weeks
=> 301 days
irb(main):002:0> Date.today + 43.weeks
=> Thu, 22 Aug 2013
irb(main):003:0> Date.today + 10.days
=> Sun, 04 Nov 2012
irb(main):004:0> Date.today + 1.years # or 1.year
=> Fri, 25 Oct 2013
irb(main):005:0> Date.today + 5.months
=> Mon, 25 Mar 2013
date.commercial([cwyear=-4712[, cweek=1[, cwday=1[, start=Date::ITALY]]]]) → date
Creates a date object denoting the given week date.
The week and the day of week should be a negative
or a positive number (as a relative week/day from the end of year/week when negative).
They should not be zero.
Para el intervalo
require ''date''
def week_dates( week_num )
year = Time.now.year
week_start = Date.commercial( year, week_num, 1 )
week_end = Date.commercial( year, week_num, 7 )
week_start.strftime( "%m/%d/%y" ) + '' - '' + week_end.strftime("%m/%d/%y" )
end
puts week_dates(22)
EG: Entrada (Número de semana): 22
Salida: 12/06/08 - 19/06/08
Crédito: Siep Korteling http://www.ruby-forum.com/topic/125140