import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date begin = format.parse("2014-11-03 09:00");
Date end = format.parse("2015-03-09 18:00");
Date[] festival = {format.parse("2015-01-01 00:00"),
format.parse("2015-01-02 00:00"),
format.parse("2015-01-03 00:00"),
format.parse("2015-01-04 00:00")};
Listmonth = getDateMonths(begin, end);
List> workDay = getWorkDate(month, festival);
work(workDay);
}
/**
* 统计时间
* */
public static void work(List> dates) {
Calendar calendar = Calendar.getInstance();
for(Listdate : dates) {
int dayNum = 0;
int hourNum = 0;
for(int i=0; icalendar.setTime(date.get(i));
int tempHour = calendar.get(Calendar.HOUR_OF_DAY);
if((i+1) != date.size()) {//非结束天以开始时间为准
calendar.set(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
0, 10);
if(date.get(i).before(calendar.getTime())) {
//开始时间在当天凌晨10分前,算整天,可按需调整
dayNum++;
} else {
hourNum += 24-tempHour;
}
} else {//最后一天以结束时间为准
calendar.set(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
23, 50);
if(date.get(i).before(calendar.getTime()) && tempHour != 0) {
hourNum += (23 - tempHour);
} else {
//开始时间在当天晚上50分后,算整天,可按需调整
dayNum++;
}
}
}
System.out.println(calendar.get(Calendar.YEAR)+"年 "+(calendar.get(Calendar.MONTH)+1)+
"月 加班"+ dayNum +"天 "+ hourNum +"小时");
}
}
/**
* 去除时间段内节假日
* */
public static List> getWorkDate(List
dates, Date[] festival) {
ArrayList> result = new ArrayList
>();
Calendar cBegin=Calendar.getInstance();
Calendar cEnd=Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
for(int i=0; icBegin.setTime(dates.get(i)[0]);
cEnd.setTime(dates.get(i)[1]);
int day = cEnd.get(Calendar.DAY_OF_MONTH) - cBegin.get(Calendar.DAY_OF_MONTH);
Listdate = new ArrayList ();
for(int j=0; j<=day; j++) {
if(j != 0) {
cBegin.add(Calendar.DAY_OF_MONTH, 1);
cBegin.set(Calendar.HOUR_OF_DAY, 0);//非开始天,开始时间为0点
}
if(j == day) {
//结束天,开始时间为24-结束小时数
cBegin.set(Calendar.HOUR_OF_DAY, (23-cEnd.get(Calendar.HOUR_OF_DAY)));
}
String begin = format.format(cBegin.getTime());
boolean isFestival = false;
for(int f=0; fif(begin.equals(format.format(festival[f]))) {
isFestival = true;
break;
}
}
if(cBegin.get(Calendar.DAY_OF_WEEK) == 1 || cBegin.get(Calendar.DAY_OF_WEEK) == 7) {
isFestival = true;
}
if(!isFestival) {
date.add(cBegin.getTime());
}
}
result.add(date);
}
return result;
}
/**
* 根据开始结束时间返回时间段内每月开始结束时间
* @return {date1:[monthBegin,monthEnd],date2:[monthBegin,monthEnd]}
* */
public static ListgetDateMonths(Date begin, Date end) {
Listmonths = new ArrayList ();
if(begin.after(end)) {
System.out.println("Bad date of begin or end...");
return null;
}
Calendar cBegin=Calendar.getInstance();
Calendar cEnd=Calendar.getInstance();
Date monthBegin = begin;
cBegin.setTime(monthBegin);
cEnd.setTime(end);
int beginYear = cBegin.get(Calendar.YEAR);
int endYear = cEnd.get(Calendar.YEAR);
int beginMonth = cBegin.get(Calendar.MONTH);
int endMonth = cEnd.get(Calendar.MONTH);
int endDay = cEnd.get(Calendar.DAY_OF_MONTH);
int endHour = cEnd.get(Calendar.HOUR_OF_DAY);
int endMinu = cEnd.get(Calendar.MINUTE);
int monthNum = 1;
if(beginYear == endYear) {
monthNum += endMonth - beginMonth;
} else if((1+beginYear) == endYear) {
monthNum += 12 - beginMonth + endMonth;
} else {
monthNum += 12 - beginMonth + endMonth + (endYear-beginYear-1)*12;
}
for(int i=0; iif(i != 0) {
cBegin.add(Calendar.MONTH, 1);
cBegin.set(cBegin.get(Calendar.YEAR), cBegin.get(Calendar.MONTH)
, 1, 0, 0);
}
if((i+1) != monthNum) {
//结束时间置为当月最后一天
cEnd.set(cBegin.get(Calendar.YEAR), cBegin.get(Calendar.MONTH)
, cBegin.getActualMaximum(Calendar.DATE)
, 23, 59);
} else {
cEnd.set(cBegin.get(Calendar.YEAR), cBegin.get(Calendar.MONTH)
, endDay, endHour, endMinu);
}
Date[] date = {cBegin.getTime(), cEnd.getTime()};
months.add(date);
}
return months;
}
}
//运行结果:
/**
2014年 11月 加班19天 15小时
2014年 12月 加班23天 0小时
2015年 1月 加班20天 0小时
2015年 2月 加班20天 0小时
2015年 3月 加班5天 18小时
*/
分为:开始结束时间按月统计、去除无效天、统计时长三个函数,应该能明白吧
细节上多久算一天,还有节假日的可以自行调节,不再累述
public class Test {
// 获取输入的日期
public static String getDateStr() {
System.out.println("请输入起始日期,回车结束:");
Scanner scanner = new Scanner(System.in);
String dateStr = scanner.nextLine();
scanner.close();
return dateStr;
}
// 获取两个日期间的时长(秒数)
public static long getdDuration(Calendar c1, Calendar c2) {
// 转换为相对时间
long t1 = c1.getTimeInMillis();
long t2 = c2.getTimeInMillis();
return Math.abs(t2 - t1);
}
public static void main(String[] args) throws Exception {
// 全局显示定义最省事安全
Locale.setDefault(Locale.ENGLISH);// 推荐用英语地区的算法
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
// 获取Calendar实例
Calendar start = Calendar.getInstance();
Calendar temp = Calendar.getInstance();
Calendar end = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String dateStr = getDateStr();
// 设置开始日期
start.setTime(format.parse(dateStr));
temp.setTime(format.parse(dateStr));
// 设置开始日期所在月份的最后一天
temp.set(Calendar.DAY_OF_MONTH, start.getActualMaximum(Calendar.DAY_OF_MONTH));
temp.set(Calendar.HOUR_OF_DAY, 23);
temp.set(Calendar.MINUTE, 59);
System.out.println("lastDay:" + format.format(temp.getTime()));
System.out.println("lastDay:" + format.format(start.getTime()));
long timeInMillis = getdDuration(start, temp);
// 计算两者相差天数
System.out.println(timeInMillis / (24 * 60 * 60 * 1000));
}
}
上面是我写的一个例子,基本思路就是:
1、判断两个日期是不是同一个月,是的话就简单了,相减就好——我上面的getdDuration方法
2、如果不是就先找到比较早的日期,找到它的该月的最后一天,然后算出最后一天与该日期的相差时间(就是我贴的代码所做的事,我就写到了这一步,下面就提供思路懒得写了)
3、找到下个月的第一天,然后判断和那个较晚的日期是不是同一个月份,不是就重复第2步,是就继续往下走;
4、计算该月的第一天和较晚日期的相差时长
每步都输出类似这样的东西:2014-12 : n天m小时
想要除去周末和法定节假日,就多加几步,获取周末可以用Calendar 的某个方法(参考这个http://blog.csdn.net/wqmain/article/details/4600310),获取法定节假日就烦了,因为每年国家政策不一样会人为的变动,你可以手动维护一张假期表,有什么变化自己修改,或者调用第三方的API,这个没去研究过,不过市场上应该是有的
可以写 see my name ,find me
你提的需求不明确。
用date类的方法啊,很好计算时间的