2010-12-23 16 views
12

Biorąc pod uwagę datę, w jaki sposób mogę znaleźć najbliższy poniedziałek w Railsach?Szyny: Czy jest tam, aby uzyskać obiekt Date, który jest najbliższy od poniedziałku do dziś?

wiem, że mogę robić takie rzeczy jak:

Date.tomorrow Date.today

Czy istnieje coś takiego jak Date.nearest: poniedziałek?

+2

zrobić trzeba iść w obu kierunkach? tj. jeśli jest wtorek, przejdź do wczoraj, ale jeśli jest piątek przejdź do następnego poniedziałku? – zsalzbank

Odpowiedz

20

Metoda commercial obiektu Date pozwoli ci to zrobić. Ten przykład pomoże Ci w następny poniedziałek.

Date.commercial(Date.today.year, 1+Date.today.cweek, 1) 

Jeśli potrzebujesz następnego lub poprzedniego poniedziałku, cokolwiek jest najbliżej można zrobić:

Date.commercial(Date.today.year, Date.today.cwday.modulo(4)+Date.today.cweek, 1) 

nie mogę wykonać to już teraz, więc wybacz mi, jeśli istnieją błędy składniowe.

+0

'.divmod (4)' zwraca tablicę. Zamiast tego możesz użyć '.divmod (4) [1]' lub '.modulo (4)' D – PeterWong

+0

@PeterWong dzięki za wskazanie tego. Zostało to poprawione. – sgriffinusa

+0

Dzięki! Przepraszam za długie opóźnienie w odpowiedzi, wakacje! :-) – Chanpory

0

Nietestowane, więc może trzeba Precyzyjnie dostrój, ale tutaj przejść:

def Date.nearest_monday 
    today = Date.today 
    wday = today.wday 
    if wday > 4 # over the half of the week 
    today + (7 - wday) # next monday 
    else 
    today - (1 + wday) # previous monday 
    end 
end 
5

Zakładając chcesz obu kierunkach: Date.today.beginning_of_week + 7*(Date.today.wday/5)

8

To trochę skomplikowane, ale nie tak trudne do oszacowania.

Aby obliczyć koniec tygodnia, użyj ActiveSupport::DateAndTimeCalculations#end_of_week, ta metoda akceptuje parametr start_day, który jest używany do wskazania dnia rozpoczęcia tygodnia (domyślnie jest to :monday). Wprowadzili nawet metodę sunday.

Sztuczka jest następująca: jeśli chcesz obliczyć najbliższy poniedziałek, możesz obliczyć go jako koniec tygodnia rozpoczynającego się we wtorek (wtorek => pierwszy dzień, środa => drugi dzień, ..., pon. => 7. dzień, który jest również końcem tygodnia).

Więc wszystko co musisz zrobić, to:

# it will return current date if today is Monday and nearest Monday otherwise 
Date.today.end_of_week(:tuesday) 
+0

Ta odpowiedź wraz z użyciem [tego] artykułu (https://stackoverflow.com/a/21199096/1612469) była dla mnie najlepszym podejściem – Aleks

3

Wiem, że to stary wątek, ale to zawsze miło, aby utrzymać go prąd dla przyszłych poszukiwaczy.

Załóżmy, że dzisiaj jest piątek, 19 sierpnia. Wszystko, co zrobić, aby mój najbliższy poniedziałek jest tak:

monday = Date.today.monday 

następnie stamtąd można wrócić w tygodniu lub przekazania w tygodniu tak:

last_monday = monday.last_week 
next_monday = monday.next_week 
Powiązane problemy