2013-03-04 18 views
7

Jestem nowy z rubinem i chcę dostać dzień ostatniego piątku każdego miesiąca. Na przykład w ostatni piątek marca jest 29, w ostatni piątek 26 kwietnia. Jak mogę uzyskać rozwiązanie? Używam szkieletu szyny.Otrzymuj dzień ostatniego piątku każdego miesiąca

Metoda .cweek zwraca tydzień roku, ale nie zwraca tygodnia bieżącego miesiąca.

+1

@sawa Przypuszczam, że jego przykład odnosi się do bieżącego roku ... – aromero

Odpowiedz

8
#!/usr/bin/env ruby 

require 'date' 

(1..12).each do |month| 
    d = Date.new(2013, month, -1) 
    d -= (d.wday - 5) % 7 
    puts d 
end 

Source (drugi/trzeci wynik Google ..)

+2

'd = Date.ne w (2013, month, -1) 'również podaje ostatni dzień miesiąca. – steenslag

+0

@steenslag Tak, wolę to. Zaktualizowałem kod –

1
require "active_support/core_ext" 

end_of_month = Date.today.end_of_month 
if end_of_month - end_of_month.beginning_of_week >= 4 
    end_of_month+5.days 
else 
    end_of_month-2.days 
end 
# => Fri, 29 Mar 2013 
+0

Twój skrypt dał czw, 04 kwietnia 2013 r. W mojej rubinowej konsoli – Leoh

+0

Przepraszam, miałem dzień tygodnia od 1. Naprawiłem to. – sawa

4

pójdę z odpowiedzią Lee, jestem tylko delegowania ten jeden, bo (myślałem) to całkiem fajne.

Korzystanie gem Chronic (https://github.com/mojombo/chronic):

#Last Friday of this coming December 
require 'chronic' 
last_friday = Chronic.parse("First Friday of next January") - 1.week 
+0

całkiem fajny klejnot! – Leoh

+2

Można by pomyśleć, że będę pierwszym, który zasugeruje również, że Chroniczny (utrzymuję to), zdecydowanie ma swoje miejsce. Nie sądzę, że to tutaj, ale z pewnością opcja nie ma znaczenia. –

2

Retrieving ostatni piątek miesiąca mogą być wykonane w jednym wierszu:

def last_fridays_for_every_month_of_year(year) 
    (1..12).map do |month| 
    Date.new(year, month, -1).downto(0).find(&:friday?) 
    end 
end 

można go używać tak:

last_fridays_for_every_month_of_year 2013 
#=> [#<Date: 2013-01-25 ((2456318j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-02-22 ((2456346j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-03-29 ((2456381j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-04-26 ((2456409j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-05-31 ((2456444j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-06-28 ((2456472j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-07-26 ((2456500j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-08-30 ((2456535j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-09-27 ((2456563j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-10-25 ((2456591j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-11-29 ((2456626j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-12-27 ((2456654j,0s,0n),+0s,2299161j)>] 
+0

Hi @tessi, czy możesz wyjaśnić, co robi fragment '.find (& friday?)'? Nie mogę znaleźć podobnej dokumentacji na ten temat. – vincentleest

+0

@vincentleest sure. 'Date.new (rok, miesiąc, -1) .downto (0)' daje tablicę dat. część find jest równa 'date_array.find {| d | d.friday?} '. Zwraca pierwszą datę, dla której 'date.friday?' Zwraca 'true'. – tessi

Powiązane problemy