业务场景:课程表周次转日期

如,2018年9-1日开学,则9-1日所在的周为第一周(2018年第35周)

通过课程表中第一周,周几获取相应的日期

第二周,周几获取相应的日期,此时的第二周则为,9-1所在周的下一周(2018年第36周)


 

/*
 * @(#)ConvertDate.java    Created on 2018年6月8日
 * Copyright (c) 2018 ZDSoft Networks, Inc. All rights reserved.
 * $Id$
 */
package net.zdsoft.ccstudy.common.util;


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


/**
 * 周转换日期类
 *
 * @author Administrator
 * @version $Revision: 1.0 $, $Date: 2018年6月8日 下午4:25:22 $
 */
public class ConvertDate {
    public static void main(String[] args) {


        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        // 获取结束周
        int computeWeeks = 0;
        try {
            computeWeeks = ConvertDate.computeWeeks(sf.parse("2018-9-1"), sf.parse("2019-1-1"));
        }
        catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


        ConvertDate cd = new ConvertDate();
        Date startDate = null;
        try {
            startDate = sf.parse("2018-9-1");
        }
        catch (ParseException e) {
            e.printStackTrace();
        }
        for (int i = 1; i <= computeWeeks; i++) {
            String dateStr1 = getDateStr(2018, startDate, i, 3);
            System.out.println("对应日期(不分单双周):" + dateStr1);


            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff(startDate) + i, 1));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 2));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 3));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 4));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 5));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 6));
            // System.out.println("开始时间: " + cd.getStartDayOfWeekNo(2018, cd.getWeekDiff("2018-09-01") + i, 7));
        }
        for (int i = 1; i <= computeWeeks; i++) {
            if (i % 2 != 0) {
                String dateStr = getDateStr(2018, startDate, i, 3);
                System.out.println("对应日期(单周):" + dateStr);
            }
        }
        for (int i = 1; i <= computeWeeks; i++) {
            if (i % 2 == 0) {
                String dateStr = getDateStr(2018, startDate, i, 3);
                System.out.println("对应日期(双周):" + dateStr);
            }
        }
        System.out.println("当前周" + getTimeInterval(new Date()));
        // System.out.println("结束周:" + cd.computeWeeksByStr("2018-09-01", "2019-01-01"));
        // System.out.println("结束时间:" + cd.getEndDayOfWeekNo(2018, cd.getWeekDiff("2019-01-01")));


    }


    /**
     * 传入起始时间,第几周第几天算出日期,例如,2018-9-1日起,则9-1所在的周为第一周,依次往后推算
     *
     * @param year
     *            当前年
     * @param startTime
     *            起始时间
     * @param week
     *            第几周
     * @param weekDay
     *            周几
     * @return
     */
    public static String getDateStr(int year, Date startTime, Integer week, int weekDay) {
        String dateStr = "";
        dateStr = getStartDayOfWeekNo(year, getWeekDiff(startTime) + week, weekDay);
        return dateStr;
    }


    /**
     * 计算两个日期间相隔的周数
     *
     * @param startDate
     *            开始日期
     * @param endDate
     *            结束日期
     * @return
     *
     */


    public static int computeWeeksByStr(String sDate, String eDate) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = null;
        Date endDate = null;
        try {
            startDate = sf.parse(sDate);
            endDate = sf.parse(eDate);
        }
        catch (ParseException e) {
            e.printStackTrace();
        }
        int weeks = 0;
        Calendar beginCalendar = Calendar.getInstance();
        beginCalendar.setTime(startDate);
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(endDate);
        while (beginCalendar.before(endCalendar)) {
            // 如果开始日期和结束日期在同年、同月且当前月的同一周时结束循环
            if (beginCalendar.get(Calendar.YEAR) == endCalendar.get(Calendar.YEAR)
                    && beginCalendar.get(Calendar.MONTH) == endCalendar.get(Calendar.MONTH) && beginCalendar
                            .get(Calendar.DAY_OF_WEEK_IN_MONTH) == endCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)) {
                break;
            }
            else {
                beginCalendar.add(Calendar.DAY_OF_YEAR, 7);
                weeks += 1;
            }
        }
        return weeks;
    }


    /**
     * 计算两个日期间相隔的周数
     *
     * @param startDate
     *            开始日期
     * @param endDate
     *            结束日期
     * @return
     *
     */


    public static int computeWeeks(Date startDate, Date endDate) {
        int weeks = 0;
        Calendar beginCalendar = Calendar.getInstance();
        beginCalendar.setTime(startDate);
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(endDate);
        while (beginCalendar.before(endCalendar)) {
            // 如果开始日期和结束日期在同年、同月且当前月的同一周时结束循环
            if (beginCalendar.get(Calendar.YEAR) == endCalendar.get(Calendar.YEAR)
                    && beginCalendar.get(Calendar.MONTH) == endCalendar.get(Calendar.MONTH) && beginCalendar
                            .get(Calendar.DAY_OF_WEEK_IN_MONTH) == endCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)) {
                break;
            }
            else {
                beginCalendar.add(Calendar.DAY_OF_YEAR, 7);
                weeks += 1;
            }
        }
        return weeks;
    }


    /**
     * 获取一个日期对应的周次
     * 
     * @param startTime
     *            时间
     * @return
     */
    public static int getWeekDiff(Date startTime) {
        // 创建一个日期实例
        Calendar ca = Calendar.getInstance();
        // 实例化一个日期
        ca.setTime(startTime);
        // 获取是第几周
        return ca.get(Calendar.WEEK_OF_YEAR) - 1;
    }


    /**
     * 获取第一天通过某月某年
     *
     * @param year
     * @param month
     * @return
     */
    public static String getFirstDayOfMonth(int year, int month) {
        String monthStr = month < 10 ? "0" + month : String.valueOf(month);
        return year + "-" + monthStr + "-" + "01";
    }


    /**
     * 月的最后一天
     *
     * @param year
     * @param month
     * @return
     */
    public static String getLastDayOfMonth(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DATE, 1);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-"
                + calendar.get(Calendar.DAY_OF_MONTH);
    }


    /**
     * 获取年
     *
     * @param year
     * @return
     */
    private static Calendar getCalendarFormYear(int year) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.set(Calendar.YEAR, year);
        return cal;
    }


    /**
     * 通过周次获取开始时间
     *
     * @param year
     *            当前年
     * @param weekNo
     *            周次
     * @day 周几
     * @return
     */


    public static String getStartDayOfWeekNo(int year, int weekNo, int day) {
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        if (day > 0) {
            cal.add(Calendar.DAY_OF_MONTH, day - 1);
        }
        return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
    }


    /**
     * 通过周次获取结束时间
     *
     * @param year
     *            当前年
     * @param weekNo
     *            周次
     * @return
     */
    public static String getEndDayOfWeekNo(int year, int weekNo) {
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        cal.add(Calendar.DAY_OF_WEEK, 6);
        return cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
    }


    /**
     * 根据当前日期获得所在周的日期区间(周一和周日日期)
     *
     * @return
     * @author zhaoxuepu
     * @throws ParseException
     */
    public static String[] getTimeInterval(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        String imptimeBegin = sdf.format(cal.getTime());
        // System.out.println("所在周星期一的日期:" + imptimeBegin);
        cal.add(Calendar.DATE, 6);
        String imptimeEnd = sdf.format(cal.getTime());
        // System.out.println("所在周星期日的日期:" + imptimeEnd);
        return new String[] { imptimeBegin, imptimeEnd };
    }
}

执行main方法,结果如下:

开始时间: 2018-8-27
开始时间: 2018-8-28
开始时间: 2018-8-29
开始时间: 2018-8-30
开始时间: 2018-8-31
开始时间: 2018-9-1
开始时间: 2018-9-2
开始时间: 2018-9-3
开始时间: 2018-9-4
开始时间: 2018-9-5
开始时间: 2018-9-6
开始时间: 2018-9-7
开始时间: 2018-9-8
开始时间: 2018-9-9
开始时间: 2018-9-10
开始时间: 2018-9-11
开始时间: 2018-9-12
开始时间: 2018-9-13
开始时间: 2018-9-14
开始时间: 2018-9-15
开始时间: 2018-9-16
开始时间: 2018-9-17
开始时间: 2018-9-18
开始时间: 2018-9-19
开始时间: 2018-9-20
开始时间: 2018-9-21
开始时间: 2018-9-22
开始时间: 2018-9-23