2011-07-16 16 views
20

Korzystnie w ruby, ale logika byłaby wystarczająco dobra ...liczba tygodni w roku, trochę

muszę numer tygodnia w roku, zważywszy, że tydzień jest niestandardowa. Powiedzmy, że definiujesz tydzień jako sobotę -> piątek. Następnie, biorąc pod uwagę datę, który numer tygodnia (1-52) jest to?

strftime ma% u:

> Time.now.strftime('%U') 
> => "28" 

... ale to oczywiście zakłada standardową niedzielę -> Sobota tygodniu.

+0

może użyć tego standardu, a następnie obliczyć własne przesunięcie w oparciu o dzisiejszy dzień tygodnia ... – Randy

+14

Niedziela -> sobota jest tylko amerykańskim standardem. Normą międzynarodową jest poniedziałek -> niedziela. – sawa

Odpowiedz

2

Może to zrobić w ten sposób;

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 
+0

Poszukuję numeru tygodnia podanego dnia. – jsharpe

17
class Date 
    def sweek 
    date = self + 1 
    date.cweek 
    end 
end 

# Today is Sunday, 17 July 
Date.today.cweek 
#=> 28 
Date.today.sweek 
#=> 29 
+0

ładne, ale +0 dla małpy łatania klasy podstawowej, przy okazji dziwnie "Time.new.strftime ('% W')! = Time.new.to_date.cweek' – akostadinov

+2

@akostadinov: Prawdopodobnie masz już dawno temu, ale dla potomności 'Time.new.strftime ('% W')' zwraca String, podczas gdy 'Time.new.to_date.cweek' zwraca liczbę całkowitą, więc nie oczekuje się, że będzie równa. – ray

20

Zastosowanie %W zamiast %U, używa poniedziałek jako pierwszy dzień tygodnia.

Time.now.strftime('%W') 
+1

Ale jest zindeksowane, w przeciwieństwie do odpowiedzi "Date.today.cweek" form @ fl00r. –

1

Możemy dowiedzieć się, jak przenieść numer tygodnia od tego, co jest zwracane przez %U (słońce zaczyna tydzień), uznając ten kalendarz fragment:

August 2015 Su Mo Tu We Th Fr Sa 1 %U => 30 2 3 4 5 6 7 8 %U => 31 9 10 11 12 13 14 15 %U => 32

sposób Załóżmy, że chcesz Wed- Wtorek, w skrócie format %? (nie musimy więc pisać "Śro zaczyna tydzień").

Chcemy:

August 2015 We Th Fr Sa Su Mo Tu 1 2 3 4 %? => 30 5 6 7 8 9 10 11 %? => 31 12 13 14 15 %? => 32

Wskazówki, jak My-Sa pobyt w tym samym numerem tygodnia w obu systemach, podczas gdy wszystkie pozostałe dni tygodnia są przenoszone do poprzedniego tygodnia w %?.

Więc możemy to zrobić:

startd = Date.new(2015, 8, 1) 
# show whole month 
pp (startd .. (startd >> 1)-1).map {|d| 
    origw = d.strftime('%U').to_i 
    # Adjust our new week number if not We-Sa: 
    neww = ([3, 4, 5, 6].include?(d.wday) ? origw : origw-1) 
    [d.to_s, origw, neww] 
} 

Jeśli chciał Sat-pt tydzień, można odjąć 1 do dni, które nie są w soboty:

d.wday == 6 ? origw : origw-1 

Należy pamiętać, że istnieje kilka przypadki skrajne, w zależności od tego, co wybierzesz w danym tygodniu (obchodzenie się z nimi jest pozostawione jako ćwiczenie dla czytelnika). Dla naszego Śr-Czw tydzień:

  • Rok 2014 zaczyna się od Wed, ale nasz algorytm stawia JAN 1 w tygodniu 0, ale powinno to być tydzień 1 (%U stawia 01 stycznia w tygodniu 1, jeżeli jest to niedziela).
  • rok 2007 (i innych lat, które rozpoczynają się na pon lub wt) spowoduje dni przed pierwszym Wed być w tym tygodniu -1 ale powinny one być tydzień 0.

Im więcej dni tygodnia Po ponownym dopasowaniu, będziesz miał więcej przypadków na krawędzi. Największy problem będzie miał tydzień Sat-Fri, ponieważ dostosowujesz 6 z 7 dni.