Java节假日算法
类:Vacation
package test; import java.io.Serializable;
import java.util.Date; public class Vacation implements Serializable { private static final long serialVersionUID = 1L;
private Date date;
private int days; public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} public int getDays() {
return days;
} public void setDays(int days) {
this.days = days;
} }
类:DateToDate
package test; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Scanner; public class DateToDate { /***************************************************************************
* 在beginDate和endDate之间所包含假期的天数,若不包含则返回0; 假期和周末分别进行单独考虑!
*
* @param list
* @param beginDate
* @param endDate
* @return
*/
public static int getContainVacation(List list, Date beginDate, Date endDate) {
int days = 0;
Calendar begincal = new GregorianCalendar();
Calendar endcal = new GregorianCalendar();
begincal.setTime(beginDate);
endcal.setTime(endDate); for (int i = 0; i < list.size(); i++) {
System.out.println("执行到这里了!");
Vacation vac = (Vacation) list.get(i);
Date tempDate = vac.getDate();
Calendar tempcal = new GregorianCalendar();
tempcal.setTime(tempDate);
int tempDays = vac.getDays();
int tempDay = tempcal.get(Calendar.DAY_OF_YEAR);
int dd = 0;
if ((tempDate.after(endDate)) || (tempDate.before(beginDate))) {
System.out.println(tempDate.after(endDate));
System.out.println("执行到这里了吗???!");
continue;
} else {
System.out.println("应该执行到这里了!@");
while (tempDay < endcal.get(Calendar.DAY_OF_YEAR)
&& dd < tempDays) {
System.out.println("符合条件吗????");
// tempcal.set(Calendar.DAY_OF_MONTH,tempDay);//原来是你在作怪!
// 节假日和周末可能有重叠的情况!
if ((tempcal.get(Calendar.DAY_OF_WEEK)) == 2
|| (tempcal.get(Calendar.DAY_OF_WEEK) == 1)) {
System.out
.println((tempcal.get(Calendar.DAY_OF_WEEK)) == 2);
System.out
.println((tempcal.get(Calendar.DAY_OF_WEEK) == 1));
System.out.println("节假日和周末重叠的情况!"
+ tempcal.get(Calendar.DAY_OF_WEEK));
days--;
}
tempcal.add(Calendar.DAY_OF_WEEK, 1);
dd++;// 计数器自增,不能超出法定的假期数。
days++;// 符合这两种条件的自增。看一下有多少天!
tempDay++;// 法定假日自增,不能超出endDate的日期数!
}
}
}
// 单独考虑周末的情况!不知道哪一个数字代表周六,周日!
System.out.println("周末!");
for (int j = begincal.get(Calendar.DAY_OF_YEAR); j <= endcal
.get(Calendar.DAY_OF_YEAR); j++) {
if (begincal.get(Calendar.DAY_OF_WEEK) == 7
|| begincal.get(Calendar.DAY_OF_WEEK) == 1) {
System.out.println("周末判断!");
days++;
}
begincal.add(Calendar.DAY_OF_YEAR, 1);
}
return days;
} /***************************************************************************
* 从文件中读取字符串到集合中,然后返回集合。
*
* @param file
* @return
* @throws Exception
*/
public static List getDateFromFile(File file) throws Exception {
List list = new ArrayList();
BufferedReader breader = new BufferedReader(new FileReader(file));
String str = "";
while ((str = breader.readLine()) != null) {
Vacation vac = DateToDate.divideStr(str);
list.add(vac);
}
System.out.println(list);
return list;
} /***************************************************************************
* 将字符串最终切割成一个假期对象!
*
* @param str
* @return
* @throws ParseException
*/
public static Vacation divideStr(String str) throws ParseException {
Vacation vac = new Vacation();
String[] array = str.split(" ");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(array[0]);
int days = Integer.parseInt(array[1]);
vac.setDate(date);
vac.setDays(days);
return vac;
} /***************************************************************************
* 输入的前后两天之间的相差的天数!
*
* @param beginDate
* @param endDate
* @return
*/
public static int getDays(Date beginDate, Date endDate) {
long days = 0;
try {
if (beginDate.compareTo(endDate) > 0) {
throw new IllegalArgumentException("日期输入不正确!");
}
days = (endDate.getTime() - beginDate.getTime())
/ (1000 * 60 * 60 * 24);
} catch (Exception e) {
e.getStackTrace();
}
return (int) days;
} /***
* 从键盘标准输入两个日期!
*
* @return
*/
public static String[] getInDate() {
System.out.println("请输入开始和结束日期!格式如下:yyyy-MM-dd");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String[] array = str.split(" ");
return array;
} public static void main(String args[]) {
String[] str = DateToDate.getInDate();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date beginDate = format.parse(str[0]);
Date endDate = format.parse(str[1]);
File file = new File("F:\\jinxing.txt");
List list = DateToDate.getDateFromFile(file);
int days = DateToDate.getContainVacation(list, beginDate, endDate);
System.out.println("总共的节假日包括周末:" + days);
int allday = DateToDate.getDays(beginDate, endDate);
System.out.println("总共的天数:" + allday);
System.out.println("总共的工作日为:" + (allday - days));
} catch (Exception e) {
e.getStackTrace();
}
} }
类:WorkDate
package test; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Scanner; public class WorkDate { /***************************************************************************
* 通过给定日期和工作日计算工作日以后的日期!
*
* @param beginDate
* @param workDays
*/
public static Date getDate(Date beginDate, int workDays, List<Vacation> list) {
Date endDate = beginDate;
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(beginDate);
int count = 1;
Calendar calFile = Calendar.getInstance();
while (count <= workDays) {
int tempBeginWeek = calBegin.get(Calendar.DAY_OF_WEEK);
if (tempBeginWeek < 7 && tempBeginWeek > 1) {
// 循环它的假期的天数!
for (int i = 0; i < list.size(); i++) {
System.out.println("至少应该循环两次!!");
Vacation vac = (Vacation) list.get(i);
Date fileDate = vac.getDate();
calFile.setTime(fileDate);
int fileDay = vac.getDays();
int tempFileDays = calFile.get(Calendar.DAY_OF_YEAR);// 年中的第几天
System.out.println("该假期是年中的第几天:" + tempFileDays);
System.out.println("今天是周几" + tempBeginWeek);
for (int j = tempFileDays; j < (tempFileDays + fileDay); j++) {
if (calBegin.get(Calendar.DAY_OF_YEAR) == j) {
System.out.println("应该有10月份的值!");
count--;
}
}
}
count++;
}
calBegin.add(Calendar.DATE, 1);
}
endDate = calBegin.getTime();
return endDate;
} /***************************************************************************
* 从文件中获取节假日,返回一个集合!
*
* @param file
* @return
* @throws Exception
*/
public static List<Vacation> getListVacation(File file) throws Exception {
List<Vacation> list = new ArrayList<Vacation>();
list = (List<Vacation>) WorkDate.getVacationDateFromFile(file);
return list;
} /***************************************************************************
* 标准输入,从屏幕输入起始日期和工作日参数!!
*
* @return
*/
public static String[] getIn() {
System.out.println("请输入起始日期和工作日参数@!!");
String str = "";
Scanner scanner = new Scanner(System.in);
str = scanner.nextLine();
String[] array = str.split(" ");
while (true) {
if (array.length <= 1) {
System.out.println("请您正确输入所需的参数!");
str = scanner.nextLine();
array = str.split(" ");
} else {
break;
}
}
return array;
} /***************************************************************************
* 将字符串进行拆分,返回一个Vacation对象!
*
* @param str
* @return
* @throws ParseException
*/
public static Vacation divideStr(String[] array) throws ParseException {
Vacation vac = new Vacation();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(array[0]);
vac.setDate(date);
int days = Integer.parseInt(array[1]);
vac.setDays(days);
return vac;
} /***************************************************************************
* 从文件中读取字符串到集合中,然后返回集合。
*
* @param file
* @return
* @throws Exception
*/
public static List<Vacation> getVacationDateFromFile(File file)
throws Exception {
List<Vacation> list = new ArrayList<Vacation>();
BufferedReader breader = new BufferedReader(new FileReader(file));
String str = "";
while ((str = breader.readLine()) != null) {
Vacation vac = DateToDate.divideStr(str);
list.add(vac);
}
return list;
} public static void main(String args[]) {
try {
File file = new File("F:\\jinxing.txt");
Vacation vac = WorkDate.divideStr(WorkDate.getIn());
List<Vacation> list = WorkDate.getListVacation(file);
Date date = WorkDate.getDate(vac.getDate(), vac.getDays(), list);
System.out.println("到这了吗?");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String strDate = format.format(date);
System.out.println(vac.getDays() + "个工作日后的日期为;" + strDate);
} catch (Exception e) {
e.printStackTrace();
}
} }
Java节假日算法的更多相关文章
- 史上最全的java随机数生成算法分享(转)
这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...
- 常用Java排序算法
常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...
- 使用Java练习算法常用的基本操作
一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...
- JAVA经典算法40题及解答
JAVA经典算法40题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...
- Java基础算法集50题
最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...
- Java经典算法四十例编程详解+程序实例
JAVA经典算法40例 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程 ...
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
- JAVA经典算法40题
1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...
- Java与算法之(13) - 二叉搜索树
查找是指在一批记录中找出满足指定条件的某一记录的过程,例如在数组{ 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15 }中查找数字15,实现代码很简单 ...
随机推荐
- 3 web服务器:静态文件
1.处理客户端请求数据 >>> s = "GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive& ...
- 面试官常问的10个Linux问题
1.如何暂停一个正在运行的进程,把其放在后台(不运行)? 为了停止正在运行的进程,让其再后台运行,我们可以使用组合键Ctrl+Z. 2.什么是安装Linux所需的最小分区数量,以及如何查看系统启动信息 ...
- 搭建cvs服务器
http://zhangjunhd.blog.51cto.com/113473/78595 http://www.cnblogs.com/lee/archive/2008/10/22/1317226. ...
- LeetCode高频题目(100)汇总-Java实现
LeetCode高频题目(100)汇总-Java实现 LeetCode高频题目(100)汇总-Java实现 目录 第01-50题 [Leetcode-easy-1] Two Sum [Le ...
- Promise关键知识
异步是ES6中使用频率最高的特性之一,也是面试中经常会被问到的问题,特此整理了相应的笔记 一.Promise的三种状态 pending-异步操作没有结束 fulfilled-异步操作已成功结束,最常见 ...
- 给socks-proxy-agent增加认证
由于需要使用socks代理,查看了nodejs的各种socks库,最终的结论是socks库是其中最完善的,而socks-proxy-agent是以其为基础的封装,可以直接和http模块对接. 不过在尝 ...
- 「Haskell 学习」二 类型和函数(上)
随着学习的深入,笔记会补充和修订.当然,这个补充修订也许会鸽,但我一定会坚持写完. 这个笔记假定你至少学过C/C++及Python,或与这两种语言类型相同的语言. 类型系统概述 “Haskell’s ...
- 不同浏览器css引入外部字体的方式
/** * 字体后缀和浏览器有关,如下所示 * .TTF或.OTF,适用于Firefox 3.5.Safari.Opera * .EOT,适用于Internet Explorer 4.0+ * .SV ...
- sql 条件插入
原普通插入语句: insert into seriestable_upload values(New.SeriesID,0); 加条件后:(当不存在该条数据插入) insert into custom ...
- lintcode-63-搜索旋转排序数组 II
63-搜索旋转排序数组 II 跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中 ...