我无法在第15个工作日获得红宝石

时间:2019-03-23 21:02:23

标签: ruby

我不能在下一个15天工作,但不能上班。

DateTime.now.next_day(+15).strftime('%d %^B %Y')

下一个第15个工作日如何获取?

6 个答案:

答案 0 :(得分:1)

您只需将当前日期增加15天。您要调整日期:

date = DateTime.now

if (date.mday > 15)
  date = date.next_month
end

date = date.next_day(15 - date.mday)

如果已超过当前月份的15号,则调整为下个月的15号。

现在可以将其扩展为枚举器:

def each_mday(mday, from: nil)
  from ||= DateTime.now

  Enumerator.new do |y|
    loop do
      if (from.mday > mday)
        from = from.next_month
      end

      from = from.next_day(mday - from.mday)

      y << from

      from += 1
    end
  end
end

这使得找到符合特定条件的第一天成为可能,例如成为工作日:

each_mday(15, from: Date.parse('2019-06-14')).find { |d| (1..5).include?(d.wday) }

返回7月15日的地点,因为6月15日是周末。

from参数是可选的,但对于测试此类情况以确保其正常工作很有用。

答案 1 :(得分:1)

15.times.reduce(Date.civil 2019, 03, 24) do |acc, _|
  begin
    acc += 1
  end while [0, 6].include? acc.wday
  acc
end
#⇒ #<Date: 2019-04-12 ((2458586j,0s,0n),+0s,2299161j)>

答案 2 :(得分:1)

因此,您要从当前日期开始添加15个工作日。您可以使用iGian或Aleksei香草红宝石答案,也可以使用business_time宝石:

15.business_days.from_now

答案 3 :(得分:0)

如果我的理解正确,那么您想在下周六或周日得到下周一。由于wday为您提供了0的太阳和6的星期六,因此您可以使用它作为向星期一添加日期的条件。

def date_add_next_week_day(days)
  date = (Date.today + days)
  date += 1 if date.wday == 6
  date += 1 if date.wday == 0
  date
end

date_add_next_week_day(15).strftime('%d %^B %Y')

答案 4 :(得分:0)

如果我明白了,您需要在指定日期后的第15天找到,跳过周末。

一个可能的选择是像这样考虑Date.html#wday来定义skipping_weekend哈希:

skip_weekend = { 6 => 2, 0 => 1}
skip_weekend.default = 0

然后:

next15 = DateTime.now.next_day(15)
next15_working = next15.next_day(skip_weekend[next15.wday]).strftime('%d %B %Y')

现在,如果next15属于工作日,则next15_working是同一天(哈希默认为0),否则如果星期六(第6个工作日,哈希映射)跳过2天到2)或1天(如果是星期日)(第0个工作日,哈希映射到1

答案 5 :(得分:0)

我假设在给定起始日期dsDate对象)和正整数n的情况下,问题在于确定较晚的日期dt ,这样ds+1dt之间(含两端)的工作日为n

require 'date'

def given_date_plus_week_days(dt, week_days)
  wday = dt.wday
  weeks, days = (week_days + {0=>4, 6=>4}.fetch(wday, wday-1)).divmod(5)
  dt - (wday.zero? ? 6 : (wday - 1)) + 7*weeks + days
end

变量wday分配给开始日期dt的星期几。开始日期将移回到上一个星期一,除非它落在星期一,在这种情况下不会更改。这反映在表达式中

wday.zero? ? 6 : (wday - 1)
dt中减去的

。将工作日的天数相应地调整为

week_days + { 0=>4, 6=>4 }.fetch(wday, wday-1)

其余的计算很简单。

def display(start_str, week_days)    
  start = Date.parse(start_str)
  7.times.map { |i| start + i }.each do |ds|
    de = given_date_plus_week_days(ds, week_days)
    puts "#{ds.strftime("%a, %b %d, %Y")} + #{week_days} -> #{de.strftime("%a, %b %d, %Y")}"   
  end
end

display("April 8", 15)
Mon, Apr 08, 2019 + 15 -> Mon, Apr 29, 2019
Tue, Apr 09, 2019 + 15 -> Tue, Apr 30, 2019
Wed, Apr 10, 2019 + 15 -> Wed, May 01, 2019
Thu, Apr 11, 2019 + 15 -> Thu, May 02, 2019
Fri, Apr 12, 2019 + 15 -> Fri, May 03, 2019
Sat, Apr 13, 2019 + 15 -> Fri, May 03, 2019
Sun, Apr 14, 2019 + 15 -> Fri, May 03, 2019

display("April 8", 17)
Mon, Apr 08, 2019 + 17 -> Wed, May 01, 2019
Tue, Apr 09, 2019 + 17 -> Thu, May 02, 2019
Wed, Apr 10, 2019 + 17 -> Fri, May 03, 2019
Thu, Apr 11, 2019 + 17 -> Mon, May 06, 2019
Fri, Apr 12, 2019 + 17 -> Tue, May 07, 2019
Sat, Apr 13, 2019 + 17 -> Tue, May 07, 2019
Sun, Apr 14, 2019 + 17 -> Tue, May 07, 2019