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?
- Przekłada numer tygodnia w terminie.
- Wprowadź interwał na podstawie numeru tygodnia.
Dzięki.
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?
Dzięki.
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
Bardzo fajnie ... Zastanawiam się, co on ma na myśli. – Abram
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. –
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
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
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"]
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
.
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