tiene septiembre semanas semana retail mayo horario fines cuantos calendario año ruby ruby-on-rails-3

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:

  1. Traducir el número de la semana en la fecha.
  2. 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