我不能在下一个15天工作,但不能上班。
DateTime.now.next_day(+15).strftime('%d %^B %Y')
下一个第15个工作日如何获取?
答案 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)
我假设在给定起始日期ds
(Date
对象)和正整数n
的情况下,问题在于确定较晚的日期dt
,这样ds+1
和dt
之间(含两端)的工作日为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