根据当前日期算出N个工作日之后的日期

需求:给定一个日期,要求算出N天(工作日)后的日期


直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
//节假日 需要手动维护配置文件或者放入db中
$holiday=[
'2017-04-29',
'2017-04-30',
'2017-05-01',
'2017-05-06',
'2017-05-07',
'2017-05-13',
'2017-05-14',
'2017-05-20',
'2017-05-21',
'2017-05-28',
'2017-05-29',
'2017-05-30',
'2017-06-03',
'2017-06-04',
'2017-06-10',
'2017-06-11',
'2017-06-17',
'2017-06-18',
'2017-06-24',
'2017-06-25',
'2017-07-01',
'2017-07-02',
'2017-07-08',
'2017-07-09',
'2017-07-15',
'2017-07-16',
'2017-07-22',
'2017-07-23',
'2017-07-29',
'2017-07-30',
'2017-08-05',
'2017-08-06',
'2017-08-12',
'2017-08-13',
'2017-08-19',
'2017-08-20',
'2017-08-26',
'2017-08-27',
'2017-09-02',
'2017-09-03',
'2017-09-09',
'2017-09-10',
'2017-09-16',
'2017-09-17',
'2017-09-23',
'2017-09-24',
'2017-10-01',
'2017-10-02',
'2017-10-03',
'2017-10-04',
'2017-10-05',
'2017-10-06',
'2017-10-07',
'2017-10-08',
'2017-10-14',
'2017-10-15',
'2017-10-21',
'2017-10-22',
'2017-10-28',
'2017-10-29',
'2017-11-04',
'2017-11-05',
'2017-11-11',
'2017-11-12',
'2017-11-18',
'2017-11-19',
'2017-11-25',
'2017-11-26',
'2017-12-02',
'2017-12-03',
'2017-12-09',
'2017-12-10',
'2017-12-16',
'2017-12-17',
'2017-12-23',
'2017-12-24',
'2017-12-30',
'2017-12-31',
//...
];
function afterWorkDay($start_timestamp='',$add_workday_num='',$holiday=[]){
// 如果加天数的的时候遇到休假日,则代表需要额外增加的天数
$extra_day=0;
//已经实际增加的天数的数量
$workday_added_num=0;
for($i=1;$i<=$add_workday_num;$i++){
$detail_time=date('Y-m-d H:i:s',($start_timestamp)+$i*(60*60*24));
$workday_added_num++;
//只取宽泛的月日就好
$wide_date=date('Y-m-d',strtotime($detail_time));
// 如果其中一天在holiday中
if(in_array($wide_date, $holiday)){
//取消已经增加的天数,后面再继续加上
$workday_added_num--;
// 需要额外增加的天数
$extra_day++;
}
//如果加完之后的日期的下一天还是休息日,需要再次增加额外增加天数
$extra_judge=date("Y-m-d",strtotime($wide_date)+86400);
}
//如果需要增加的天数与实际已经增加的天数不相等
if($add_workday_num!=$workday_added_num){
while (in_array($extra_judge, $holiday)) {
$extra_day++;
$extra_judge=date("Y-m-d",strtotime($extra_judge)+86400);
}
}
//实际应增加总天数=已经增加天数+(应增加天数-已经增加天数)+额外需要增加天数
$add=$workday_added_num+($add_workday_num-$workday_added_num)+$extra_day;
return date('Y-m-d H:i:s',($start_timestamp)+$add*(60*60*24));
// $result_date=date('Y-m-d',($start_timestamp)+$add*(60*60*24));
// 如果这个结果也是在假期日内
// while (in_array($result_date, $holiday)) {
// $result_date=date('Y-m-d',strtotime($result) +86400);
// $result=date('Y-m-d H:i:s',strtotime($result) +86400);
// }
}
// xx发起时间 6月1日是周四,
$time=mktime('13','30','56','06','01','2017');
$start_timestamp=$time;
// var_dump($start_timestamp);
//计算两个工作日后的时间
echo afterWorkDay($start_timestamp,2,$holiday);//out put 2017-06-05 13:30:56

2017国务院放假权威安排