`
kaobian
  • 浏览: 211740 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

计算两个日期点间的周末天数

    博客分类:
  • java
阅读更多
闲来无事,想起这么一个问题,所以就试着搞了搞这个算法,希望大家可以给出更加高效和牛叉的算法来求取“两个时间点间的周末天数”

import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * @author kaobian.iteye.com
 * @date Apr 5, 2012 
 * @time 12:46:44 PM 
 */
public class ComputeWorkDay {
	
	public static void main(String[] args) {
		//初始化第一个日期
		Calendar c1 = Calendar.getInstance();
		//初始化第二个日期,这里的天数可以随便的设置
		Calendar c2 = Calendar.getInstance();
		c2.add(Calendar.DAY_OF_YEAR,13);
		//查看一下第二个日子的具体时间
		System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(c2.getTime()));
		//第三个三处代表是否 去除 双休日
		System.out.println(computeHolidays(c2,c1,false));
	}
	
	public static int computeHolidays(Calendar cal1,Calendar cal2,boolean ignoreHolidays){
		//算出两个日期间的天数
		int days = cal2.get(Calendar.DAY_OF_YEAR)-cal1.get(Calendar.DAY_OF_YEAR);
		//我们的计算的天数是包含两个日期,也就是一个 闭区间
		days = days > 0 ? days + 1 : 1 - days; 
		
		if(ignoreHolidays){
			return days;
		}
		
		int holidays = 0;
		//确定一个 大日期
		if(cal1.compareTo(cal2) > 0){
			Calendar temp = cal1;
			cal1 = cal2;
			cal2 = temp;
			temp = null;
		}
		//只要两个日期之间相隔的天数 是7 的整数倍,那么 双休日的时间 一定为 2*(对7的整数倍)
		holidays = (days/7)*2;
		//去除整数倍的时间后,看看两个日期间的 周末天数
		cal1.add(Calendar.DAY_OF_YEAR,(days/7)*7);
		
		int day = -1;
		//如果两个日期间的 间隔天数正好是7的整数倍也就不用 循环找周末了
		do{
			day = cal2.get(Calendar.DAY_OF_WEEK);
			if (day == 1 || day == 7)
				holidays++;
			if(cal1.compareTo(cal2) == 0) 
				break;
			cal2.add(Calendar.DAY_OF_YEAR,-1);
		} while ((days%7) > 0);
		
		return holidays;
	}
}


2
1
分享到:
评论
4 楼 fuchengyong 2013-10-23  
fuchengyong 写道
思路很好,但是不支持跨前计算


思路很好,但是不支持跨年计算
3 楼 fuchengyong 2013-10-23  
思路很好,但是不支持跨前计算
2 楼 kaobian 2012-04-06  
mfkvfn 写道
假设星期一~星期天用0~6表示。假设起始日期是星期a,终止时期是星期b,中间间隔天数是x。
则0<=a<=6,0<=b<=6, b==(a+x)%7。只要给出a,x就可以得到b。

周末天数=间隔周数*2+其它天数。
间隔周数=x/7。(取整数)

其它天数的计算有以下几种:
(A) 0<=a<=b<=4<=6,其它天数=0。
(B) 0<=a<=4<=b<=6,其它天数=b-4。
(C) 0<=4<=a<=b<=6,其它天数=b-a。
(D) 0<=b<=a<=4<=6,其它天数=2。
(E) 0<=b<=4<=a<=6,其它天数=6-a。
(F) 0<=4<=b<=a<=6,其它天数=(6-a)+(b-4)=2+b-a。

比如a=2(周三),x=20,b=1(周二)。则周未天数是 20/7*2+2=6。
比如a=5(周六),x=9,b=0(周一)。则周未天数是 9/7*2+(6-5)=3。

你这个判断条件 挺好的,有一个地方需要修改一下
在第三个条件上 结果应该是 b-a+1
1 楼 mfkvfn 2012-04-06  
假设星期一~星期天用0~6表示。假设起始日期是星期a,终止时期是星期b,中间间隔天数是x。
则0<=a<=6,0<=b<=6, b==(a+x)%7。只要给出a,x就可以得到b。

周末天数=间隔周数*2+其它天数。
间隔周数=x/7。(取整数)

其它天数的计算有以下几种:
(A) 0<=a<=b<=4<=6,其它天数=0。
(B) 0<=a<=4<=b<=6,其它天数=b-4。
(C) 0<=4<=a<=b<=6,其它天数=b-a。
(D) 0<=b<=a<=4<=6,其它天数=2。
(E) 0<=b<=4<=a<=6,其它天数=6-a。
(F) 0<=4<=b<=a<=6,其它天数=(6-a)+(b-4)=2+b-a。

比如a=2(周三),x=20,b=1(周二)。则周未天数是 20/7*2+2=6。
比如a=5(周六),x=9,b=0(周一)。则周未天数是 9/7*2+(6-5)=3。

相关推荐

    计算两个日期之间周末的天数和工作日天数

    本人编写,通过自己定义的函数计算两个日期之间周末的天数和工作日天数,经过测试,非常好用

    计算2个日期相差天数、去除节假日周末

    在编程领域,尤其是在数据分析、日程管理或者时间序列分析中,计算两个日期之间的差异并考虑工作日排除节假日和周末是一项常见的任务。C++作为一种强大的系统级编程语言,提供了丰富的库来处理日期和时间操作。本篇...

    计算除周六日、法定节假日以外两个日期之间的间隔天数

    计算除周六日、法定节假日以外两个日期之间的间隔天数

    计算两个日期之间工作日天数(c#实现)

    ### 计算两个日期之间的工作日天数(C#实现) 在日常工作中,我们经常会遇到需要计算两个日期之间的工作日数量的情况。例如,在处理项目管理、财务结算或是人力资源管理时,了解两个日期之间的实际工作日数量是非常...

    oracle语句查询两个日期之间星期六、星期日的天数

    oracle语句查询两个日期之间星期六、星期日的天数

    2023年日历(标记工作日,节假日,调休,周末),计算两个日期相差的工作日天数

    压缩包里有2个文件,用于计算两个日期相差的工作日天数(排除周末和法定节假日): 1、excel表为2023年日历数据,并且备注工作日、周末,调休、节假日类型,可导入数据库。 2、SQL文件为2023年所有日期的插入SQL,并...

    java 请假天数计算工具类

    使用Java 8的日期时间API(`java.time`包)来处理日期和时间,如计算两个日期之间的天数,判断是否为工作日等。同时,为了提高效率和减少数据库交互,可以利用Redis的特性,将部分计算结果缓存起来。 综上所述,这...

    Excel2021,计算两个日期之间工作日的天数.docx

    Excel 中使用 NETWORKDAYS 函数计算两个日期之间的工作日天数 在 Excel 中,计算两个日期之间的工作日天数是一个常见的需求,特别是在企业中,需要计算员工的工作日天数以便进行薪资核算、考勤管理等。Excel 提供了...

    MSSQL 计算两个日期相差的工作天数的语句

    在SQL Server中,有时我们需要计算两个日期之间相差的工作日数量,即排除周末和法定假日的天数。在提供的示例中,给出了两种不同的T-SQL函数实现方式来完成这个任务,这两种方法都针对MSSQL数据库系统。我们将分别...

    java计算两个日期之前的天数实例(排除节假日和周末)

    "java计算两个日期之前的天数实例(排除节假日和周末)" 知识点1:Java日期计算 在Java中,日期计算是一种常见的操作。Java提供了多种日期类,例如Date、Calendar、LocalDate等,每种类都有其特点和应用场景。例如,...

    一个可以计算天数的软件

    "一个可以计算天数的软件"指的是一个专门设计用于计算两个日期之间相差天数的应用程序。这样的工具可以帮助用户快速、准确地执行日期相关的计算,无论是在日常生活中还是在专业工作中。 首先,我们来探讨一下日期和...

    请假时长计算和每月工作天数计算源码

    可以先将两个日期转换为`LocalDateTime`,然后使用`Duration.between()`计算差值,最后通过`Duration.toHours()`获取小时数。 ```java import java.time.*; public class LeaveDurationCalculator { public ...

    计算工作日

    - **计算总天数**:计算两个日期之间的总天数。 - **计算工作日总数**:基于总天数,减去周末天数得到工作日总数。 - **考虑剩余天数**:根据剩余天数进一步调整工作日总数。 - **排除节假日**:遍历节假日数组,...

    获取两个日期类型相差天数

    获取两个日期之间的天数,使用整数计量而不是毫秒数约算,例:2017-11-26 23:59:59 与2017-11-27 00:00:00相差天数是1.

    SQL工作日计算,只排除周末

    在数据库管理和数据分析领域,准确地计算两个日期之间的有效工作日数量是一项非常实用的功能,特别是在需要排除周末(通常指周六和周日)的情况下。这种计算方法对于财务报告、项目管理以及人力资源规划等方面至关...

    asp.net+c#做的计算任意两天的间隔和工作日天数的源码

    本项目是一个使用ASP.NET+C#编写的源码,其主要功能是计算两个日期之间的总天数以及工作日的天数。这个功能在很多实际场景下都有应用,例如财务管理、人力资源规划或项目进度管理。 首先,让我们深入理解ASP.NET...

    利用Excel公式计算上个月的考勤天数.rar

    `DATEDIF`函数在这里用于计算两个日期之间的天数,参数`"d"`表示我们要的是天数。 然而,实际的考勤表可能还需要考虑周末和节假日。Excel提供了一些内置函数,如`WEEKDAY`来确定日期是星期几,以及`NETWORKDAYS`来...

    计算一段日期内的周末天数的php代码(星期六,星期日总和)

    函数会计算出在这两个日期之间包含的所有周末天数。 日期格式转换: 在PHP中,日期格式可以通过strtotime()函数转换为时间戳格式,这是处理日期和时间的一个基础功能。例如,可以将日期字符串如"***"或"2009-10-16...

    2日期相隔天数计算

    例如,你可以计算两个日期之间的完整工作日数,这需要考虑周末和节假日。这通常需要更复杂的逻辑,可能需要借助专门的日历库,如Python的`pandas`库或者`workalendar`库。 在实际应用中,日期计算可能涉及到时区...

    JAVA时间工具类(计算法定工作日工时等)

    计算某个日期加上几个工作日后的一个工作日期(除周末和法定节假日),计算某个日期后一天的工作日期(除周末和法定节假日),计算两个日期的真实工作日(除周末和法定节假日),判断一个日期是否是夏季时间,计算两个时间...

Global site tag (gtag.js) - Google Analytics