代码之家  ›  专栏  ›  技术社区  ›  phạm tuấn

Ruby查找除周末以外的日期

  •  1
  • phạm tuấn  · 技术社区  · 8 年前

    我想在输入日期时创建一个def get day。除周末外,我们一周工作五天。
    截止日期:2018年2月27日
    您输入:3->发布日期:2018年3月2日
    您输入:5->发布日期:2018年3月6日
    您输入:7->发布日期:2018年3月8日
    您输入:10->发布日期:2018年3月13日

    我的代码:

    require 'date'
    
    def next_week d, c
       return d + 7 * c
    end
    
    def my_add_day day
        d = Date.today
        d = next_week d, day/5
        day = day % 5
        if (6 - d.wday) > day
            d = d + day
        else
            d = d + day + 2
        end
        return d
    end
    


    你可以使用gem https://github.com/bokmann/business_time

    3 回复  |  直到 8 年前
        1
  •  3
  •   Aleksei Matiushkin    8 年前
    def add_working_days date, num
      num.times.inject(date) do |date|
        case date.wday
        when 5 then date + 3
        when 6 then date + 2
        else date + 1
        end
      end
    end
    
    main ▶ add_working_days Date.today, 3
    #⇒ #<Date: 2018-03-02 ((2458180j,0s,0n),+0s,2299161j)>
    main ▶ add_working_days Date.today, 5
    #⇒ #<Date: 2018-03-06 ((2458184j,0s,0n),+0s,2299161j)>
    main ▶ add_working_days Date.today, 7
    #⇒ #<Date: 2018-03-08 ((2458186j,0s,0n),+0s,2299161j)>
    main ▶ add_working_days Date.today, 10
    #⇒ #<Date: 2018-03-13 ((2458191j,0s,0n),+0s,2299161j)>
    
        2
  •  2
  •   Tom Lord    8 年前

    使用 business_time gem(它允许额外的特性,例如定义 BusinessTime::Config.holidays ),可以写为:

    1.business_day.after(date)
    

    或者作为更通用的助手方法:

    def add_working_days(date, num)
      num.business_days.after(date)
    end
    

    如果这是应用程序中需要解决的常见/复杂问题,我建议使用此库。

        3
  •  1
  •   koffeinfrei    8 年前

    您可以使用 lazy enumerator 在ruby中,可以跳过所有未来的周六和周日,以功能性的方式获取下一个工作日的日期,而不带任何条件。

    def next_workday(number_of_days)
      (DateTime.now..DateTime::Infinity.new)
        .lazy
        .reject { |x| x.saturday? || x.sunday? }
        .drop(number_of_days)
        .first
    end
    
    推荐文章