问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么鉴别匡威真假鉴别鉴别匡威真假的方法与技巧 洛阳小碗汤怎么做 酥肉丸子汤如何烹饪简单而又不失美味? 直通车产出比多少不亏?产出比低怎么调整? 淘宝直通车投产比多少才是盈利?怎么提升? 车打不着拧钥匙没反应 车打火的钥匙拧不动 微信关闭时后台还在图标上还有个小锁什么意思 坦克世界闪击战电脑需求配置玩坦克世界电脑配置要达到什么标准_百度... 坦克世界对电脑配置要求高不高玩坦克世界电脑需要什么配置要求 坦克世界对电脑的配置要求是多少坦克世界配置要求 SQL语句如何统计a时间和b时间有多少个工作日? sqlserver 2008远程连接失败,也搜索了不少内容 连接不上远程服务器 sql server 2005 远程连接问题,请高手看看! SQL Server 行远程连接失败 SQLServer远程连接失败怎么办 sql server 如何设置禁止对某一个表增,删,修改。听说触发器可以,具体代码是什么? 如何设置sql server 2000,使其在客户端修改或新建表,在服务器端数据不变 SQL Server 2000如何禁止用户查看其他数据库列表和可登录用户的列表 在sql sever 中怎么用语句给予用户建表的权限 win 7 安装 sql server 2000 后不能在企业管理器中创建表 SQL Server怎么设置表的权限. 对mssql里的数据库进行加密, 别人能附加但不能查看数据库的表,存储过程等内容 sqlserver 加密特定字段,用windows集成身份才能看到明文,也就是要数据库本机才能看到。 SQLSERVER将表中一列明文密码导入到另外一列并MD5加密 SQLServer数据库 不制作证书是否能加密SQLSERVER与客户端之间传输的数据 如何开启sqlserver ted 加密 MsSQLServer是如何加密口令的 vb连接数据库sqlserver的问题 SQL怎么实现:一个日期加上多少个工作日后是多少号? SQL中怎么能得到两个日期之间的所有日期值 求一段sql server 存储过程的代码 用以实现JSP中分页 哪位高手愿根据我的SQL分页存储过程写一个完整的asp分页显示代码? 关于asp结合sql server 分页存储过程代码 sql临时表的创建读取删除问题 客户端可不可以同时对SQL中的一个临时表进行建立或删除 SQL临时表的创建 临时表inserted表和deleted表有什么作用 sqlserver多表查询的一个问题 sqlserver怎么使用日志恢复 如何使用事务日志恢复SQLServer数据库 怎么设置sql2008允许远程访问 如何配置 SQL Server 2005,以允许远程连接 如何配置 SQL Server 2008 以允许远程连接 sql server 2008怎么配置允许远程连接 sql server2008远程连接配置 如何设置sql server 2008 允许远程连接 如何使用BULK INSERT将CSV或TXT文件导入到SQL Server中 写好BULK INSERT语句该怎么执行