Java编写开一个类实现以下功能:

2025年01月05日 18:38
有5个网友回答
网友(1):

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")};
        
        List month = getDateMonths(begin, end);
        List> workDay = getWorkDate(month, festival);
        work(workDay);
    }
    
    /**
     * 统计时间
     * */
    public static void work(List> dates) {
        Calendar calendar = Calendar.getInstance();
        
        for(List date : dates) {
            int dayNum = 0;
            int hourNum = 0;
            for(int i=0; i                calendar.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; i            cBegin.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);
            
            List date = 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; f                    if(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 List getDateMonths(Date begin, Date end) {
        List months = 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; i            if(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小时
*/

分为:开始结束时间按月统计、去除无效天、统计时长三个函数,应该能明白吧

细节上多久算一天,还有节假日的可以自行调节,不再累述

网友(2):

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,这个没去研究过,不过市场上应该是有的

网友(3):

可以写 see my name ,find me

网友(4):

你提的需求不明确。

网友(5):

用date类的方法啊,很好计算时间的