2017-02-02 1 views
1

In meiner Rails-Anwendung muss ich herausfinden, ob ein bestimmtes Datum der zweite oder vierte Samstag des Monats ist. Was ist der effiziente Weg, dies zu tun? Gibt es ein Juwel, das ich benutzen kann?Gegeben ein Datum, wie man findet, wenn es der zweite oder vierte Samstag des Monats ist

+0

Was haben Sie versucht? –

+0

Ich habe den Anfang des Monats, das Ende des Monats und ihre Tage. Arbeite immer noch durch. – user1575148

+0

"Ich habe den Anfang des Monats, das Ende des Monats und ihre Tage. Durcharbeiten noch immer." - Zeig uns den Code !! Bitte fügen Sie Ihren Code in SO Fragen ein, Sie werden viel eher Hilfe bekommen! – samiles

Antwort

3
  • Tage 1 bis 7 Wochen 0
  • Tage 8 bis 14 sind Woche 1
  • Tage 15 bis 21 sind Woche 2
  • Tage 22 bis 28 sind woche 3

Um die Woche ID zu erhalten, können wir berechnen (date.day-1)/7. Da die ID nullbasiert ist, haben der zweite und der vierte Samstag eine ID der ungeraden Woche:

2
def fourth_saturday?(date) 
    saturdays = (date.beginning_of_month..date.end_of_month).select { |date| date.wday == 6 } 
    [satudays.second, saturdays.fourth].include?(date) 
end 
  1. schaffen ein Monat Datumsbereich
  2. wählen Samstag
  3. sehen, ist, wenn der zweite oder vierte Samstag bis heute gleich

Als @Stefan freundlich vorgeschlagen, die erste Zeile der Methode könnte wie folgt geschrieben werden (mit all_month):

saturdays = date.all_month.select(&:saturday?) 

Referenzen:

+0

'samstags = date.all_month.select (&: samstag?)' Würde in eine Zeile passen ;-) – Stefan

+1

@Stefan ahah, morgen, also morgen, danke! –

+3

'saturdays.first' und 'samstags.third' sind nicht äquivalent zu' samstags [1] 'und' samstags [3] ' – Stefan

4

Der zweite Samstag im Tagesbereich sein muss 8-14 und die vierte in den Tag Bereich 22-28. Also ich denke, das sollte funktionieren

def second_or_forth_saturday?(date) 
    return false unless date.saturday? 
    (8..14).include?(date.day) || (22..28).include?(date.day) 
end 
+0

letzten 2 Zeilen könnte '(8..14) .include? (Date.day) || (22..28) .include? (Date.day) ' –

+0

' date.wday == 6' kann als 'date.saturday?' Ausgedrückt werden – Stefan

+1

Danke Eric Duminil & Stefan. Sie haben beide Recht, und ich habe meine Antwort als Ergebnis aktualisiert – ReggieB

Verwandte Themen