java 计算 2个日期间隔多少个工作日
发布网友
发布时间:2022-04-11 15:52
我来回答
共4个回答
懂视网
时间:2022-04-11 20:14
/*
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
末一个星期的工作日数:DATEPART(dw, @enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数 - 第一个星期的天数 - 末一个星期的天数) / 7 * 5
+ 第一个星期的工作日数
+ 末一个星期的工作日数
*/
--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算
--必须先SET DATEFIRST 1
CREATE FUNCTION dbo.CalcWorkHours(@bdate DATETIME, @edate DATETIME)
RETURNS INTEGER
AS BEGIN
DECLARE @hours INTEGER
IF @@DATEFIRST <> 1 OR @bdate > @edate
RETURN -1
SELECT @hours =
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE WHEN DATEPART(wk, @edate-1)-DATEPART(wk,@bdate) = 0 THEN
CASE WHEN DATEPART(dw, @bdate) > 5 THEN 0
WHEN DATEPART(dw, @edate-1) > 5 THEN 6 - DATEPART(dw, @bdate)
ELSE DATEPART(dw, @edate-1) - DATEPART(dw, @bdate) + 1 END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数 * 5
ELSE (DATEDIFF(dd,@bdate,@edate)
- (8-DATEPART(dw, @bdate))
- DATEPART(dw, @edate-1)) / 7 * 5
--再加上第一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @bdate) < 6 THEN 6 - DATEPART(dw, @bdate)
ELSE 0 END
--加上末一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @edate-1)>5 THEN 5 ELSE DATEPART(dw, @edate-1) END
END * 8
RETURN @hours
END
热心网友
时间:2022-04-11 17:22
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date begDate = sdf.parse("2014-01-04");
Date endDate = sdf.parse("2014-01-04");
if (begDate.after(endDate))
throw new Exception("日期范围非法");
// 总天数
int days = (int) ((endDate.getTime() - begDate.getTime()) / (24 * 60 * 60 * 1000)) + 1;
// 总周数,
int weeks = days / 7;
int rs = 0;
// 整数周
if (days % 7 == 0) {
rs = days - 2 * weeks;
}
else {
Calendar begCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
begCalendar.setTime(begDate);
endCalendar.setTime(endDate);
// 周日为1,周六为7
int beg = begCalendar.get(Calendar.DAY_OF_WEEK);
int end = endCalendar.get(Calendar.DAY_OF_WEEK);
if (beg > end) {
rs = days - 2 * (weeks + 1);
} else if (beg < end) {
if (end == 7) {
rs = days - 2 * weeks - 1;
} else {
rs = days - 2 * weeks;
}
} else {
if (beg == 1 || beg == 7) {
rs = days - 2 * weeks - 1;
} else {
rs = days - 2 * weeks;
}
}
}
System.out.println(sdf.format(begDate)+"到"+sdf.format(endDate)+"中间有"+rs+"个工作日");
}
}
如果只算双休的话
热心网友
时间:2022-04-11 18:40
一个假期维护表,表示哪些天放假、哪些天周末上班。
然后,得到日期间的天数、去掉周末。再去除一些平时放假的 、 或加上一些周末上班的。
不然就 逐日数吧。因为周末可能上班、平时可能随时不上班。
热心网友
时间:2022-04-11 20:14
public static List<String> getWorkDays(String date1,String date2)throws Exception{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//首先得到两个日期之间的所有日期信息
List<String> allDays = new ArrayList<>();
int dayTime = 24*60*60*1000;
long d1 = format.parse(date1).getTime();
long d2 = format.parse(date2).getTime();
while(d2>=d1){
String time = format.format(d1);
allDays.add(time);
d1+=dayTime;
}
//将得到的所有日期遍历,将每个日期的星期信息取出,然后将周日和周六的过滤掉即可
Calendar calendar = Calendar.getInstance();
List<String> workdays = new ArrayList<>();
for(String str : allDays){
calendar.setTime(format.parse(str));
int week = calendar.get(Calendar.DAY_OF_WEEK);
if(week!=1 && week!=7){
workdays.add(str);
}
}
return workdays;
}
public static void main(String[] args) throws Exception{
List<String> result = getWorkDays("2018-02-01","2018-02-24");
System.out.println(result);
}