Rails: Is there away to get the Date object that is the closest Monday to today?

后端 未结 5 921
误落风尘
误落风尘 2021-02-07 12:54

Given a date, how do I find the nearest Monday in Rails?

I know I can do things like:

Date.tomorrow Date.today

Is there something like Date.nearest :mond

相关标签:
5条回答
  • 2021-02-07 13:06

    The commercial method on the Date object will let you do this. This example will get you the next Monday.

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

    If you need the next or previous Monday, whichever is closest, you can do:

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

    I can't execute this right now, so forgive me if there are syntax errors.

    0 讨论(0)
  • 2021-02-07 13:09

    Untested, so you might need to finetune, but here you go:

    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 
    
    0 讨论(0)
  • 2021-02-07 13:11

    Assuming you want both directions: Date.today.beginning_of_week + 7*(Date.today.wday/5)

    0 讨论(0)
  • 2021-02-07 13:16

    I know this is an old thread but it's always nice to keep it current for future seekers.

    Let's assume today is say Friday the 19th of August. All I do to get my nearest Monday is this:

    monday = Date.today.monday
    

    Then from there you can go back a week or forward a week like this:

    last_monday = monday.last_week
    next_monday = monday.next_week
    
    0 讨论(0)
  • 2021-02-07 13:25

    It's a little bit tricky, but not so hard to calculate.

    Use ActiveSupport::DateAndTimeCalculations#end_of_week to calculate end of a week, this method accepts a start_day parameter that is used to indicate start day of the week (it's :monday by default). They even have implemented sunday method.

    The trick is the following: if you want to calculate closest Monday, you may calculate it as a end of the week which starts on Tuesday (Tue => 1st day, Wed => 2nd day, ..., Mon => 7th day which is also end of the week).

    So all you need to do is:

    # it will return current date if today is Monday and nearest Monday otherwise
    Date.today.end_of_week(:tuesday) 
    
    0 讨论(0)
提交回复
热议问题