2012-10-25 9 views
20

Chciałbym wiedzieć, jak uzyskać numer bieżącego tygodnia od Rails i jak mogę manipulować go:Rails 3.2.8 - Jak uzyskać numer tygodnia z Rails?

  1. Przekłada numer tygodnia w terminie.
  2. Wprowadź interwał na podstawie numeru tygodnia.

Dzięki.

+0

Co masz na myśli, "interwał"? Interwał to odległość między dwiema datami. Nie można zrobić odstępu od liczby całkowitej. – meagar

Odpowiedz

42

Zastosowanie strftime:

%U - numer tygodnia w roku. Tydzień zaczyna się od niedzieli. (00..53)
%W - Numer tygodnia w roku. Tydzień zaczyna się od poniedziałku. (00..53)

Time.now.strftime("%U").to_i # 43 

# Or... 

Date.today.strftime("%U").to_i # 43 

Jeśli chcesz dodać 43 tygodni (lub dni, lata, minut, etc ...) do daty, można użyć 43.weeks, dostarczonych przez 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 
+0

Bardzo fajnie ... Zastanawiam się, co on ma na myśli. – Abram

+0

Dzięki za odpowiedź, pozwól mi wyjaśnić przedział. Jeśli posiadam OCT-12 na OCT-19, należą do różnych tygodni. Myślę, że mogę przekonwertować każdy z nich na każdy z ich odpowiednich numerów tygodniowych, a następnie mieć przedział numerów tygodniowych. O to mi chodziło. –

+0

To tylko odejmowanie. Konwersja każdej daty na ich numer tygodnia da dwie liczby całkowite. Możesz po prostu odjąć drugi od pierwszego. – meagar

4
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. 

Dla przedziału

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: Wejście (Tydzień Number): 22

wyjściowa: 12/06/08 - 06/19/08

kredytowej: Siep Korteling http://www.ruby-forum.com/topic/125140

2

Date#cweek wydaje się dostać ISO -8601 numer tygodnia (tydzień w poniedziałek), taki jak %V w strftime (wspomniany przez @Robban w komentarzu).

Na przykład, poniedziałek i niedziela tygodnia Piszę to:

[ 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"] 
10

Będziesz chciał się trzymać z dala od strftime("%U") i "%W".

Zamiast tego należy użyć Date.cweek!

Problem jest, jeśli kiedykolwiek chcesz wziąć numer tygodnia i przekształcić go w terminie, strftime nie daje wartości, które można przejść z powrotem do Date.commercial.

Date.commercial oczekuje zakresu wartości opartych na 1. Date.strftime("%U|%W") zwraca wartość, która wynosi 0. Można by pomyśleć, że możesz dać mu +1 i być w porządku. Problem uderzy cię pod koniec roku, kiedy będzie 53 tygodnie. (Jak to się właśnie stało ...)

Na przykład, spójrzmy na koniec grudnia 2015 roku, a wyniki z dwóch opcji na uzyskanie numeru tygodniu:

Date.parse("2015-12-31").strftime("%W") = 52 
Date.parse("2015-12-31").cweek = 53 

Teraz spójrzmy na przekształcenie tego numer tygodnia do daty .. .

Date.commercial(2015, 52, 1) = Mon, 21 Dec 2015 
Date.commercial(2015, 53, 1) = Mon, 28 Dec 2015 

Jeśli ślepo tylko +1 wartość można przejść do Date.commercial, będziesz skończyć z nieprawidłową datą w innych sytuacjach:

na przykład, grudzień 2014:

Date.commercial(2014, 53, 1) = ArgumentError: invalid date 

Jeśli kiedykolwiek przekonwertować numer tygodnia z powrotem do tej pory jedyny murowany sposobem jest użycie Date.cweek.

Powiązane problemy