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();
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM