计算当前周、月、季、半年、一年和上周、上月、上季、当前半年的上一个半年、上年的开始和结束时间

下面的例子是一个完整的工具类,记录了各种获取开始时间和结束时间的方法,其中本人用过的个别方法为开始时间和结束时间格式为 2019-10-10 00:00:00 ,2019-10-10 23:59:59,最下方有测试类,可以先执行一下,根据自己的需要去修改

package cn.shangze.gf.common.utils;

import lombok.extern.slf4j.Slf4j;

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

/**
 * 时间计算工具类
 */
@Slf4j
public class TimeCalculationUtil {


    private static final SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
    private static final SimpleDateFormat longHourSdf = new SimpleDateFormat("yyyy-MM-dd HH");
    private static final SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 计算2个日期之间相差的天数
     * 比如:2011-02-02 到  2017-03-02   以日为单位相差为:2220天
     * @param StartDate 开始时间
     * @param endDate  结束时间
     * @return
     */
    public static int dayCompare(String StartDate, String endDate){
        Calendar startCalendar  =  Calendar.getInstance();
        Calendar  endCalendar  =  Calendar.getInstance();
        try {
            startCalendar.setTime(longSdf.parse(StartDate));
            endCalendar.setTime(longSdf.parse(endDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int day = (int) ((endCalendar.getTimeInMillis()  -  startCalendar.getTimeInMillis())  /  (24  *  3600  *  1000));
        System.out.println(day);
        return day;
    }

 /*****************************  根据年份和月份获取当月开始时间结束时间 **************************************/
    public static Date getBeginTime(int year, int month) {
        YearMonth yearMonth = YearMonth.of(year, month);
        LocalDate localDate = yearMonth.atDay(1);
        LocalDateTime startOfDay = localDate.atStartOfDay();
        ZonedDateTime zonedDateTime = startOfDay.atZone(ZoneId.of("Asia/Shanghai"));
        return Date.from(zonedDateTime.toInstant());
    }

    public static Date getEndTime(int year, int month) {
        YearMonth yearMonth = YearMonth.of(year, month);
        LocalDate endOfMonth = yearMonth.atEndOfMonth();
        LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999);
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
        return Date.from(zonedDateTime.toInstant());
    }

  /*****************************  判断当前时间是否在[startTime, endTime]区间 **************************************/

    /**
   * 判断当前时间是否在[startTime, endTime]区间(包含startTime和endTime),注意时间格式要一致
   * @param nowTime 当前时间
   * @param startTime 开始时间
   * @param endTime 结束时间
   * @return
   * @author jqlin
   */
    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
        if (nowTime.getTime() == startTime.getTime()|| nowTime.getTime() == endTime.getTime()) {
            return true;
        }
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);
        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);
        Calendar end = Calendar.getInstance();
        end.setTime(endTime);
        if (date.after(begin) && date.before(end)) {
            return true;
	    } else {
	     return false;
	    }
    }

     /*****************************  获取服务器当前年份/月份 **************************************/
    // 获取今年是哪一年
    public static Integer getNowYear() {
        Date date = new Date();
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(date);
        return Integer.valueOf(gc.get(1));
    }

    // 获取本月是哪一月
    public static int getNowMonth() {
        Date date = new Date();
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(date);
        return gc.get(2) + 1;
    }

    /*****************************  获得本周、本季等开始、结束时间的方法 **************************************/

    // 获得当天0点时间
    public static Date getTimesmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();


    }
    // 获得昨天0点时间
    public static Date getYesterdaymorning() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(getTimesmorning().getTime()-3600*24*1000);
        return cal.getTime();
    }
    // 获得当天近7天时间
    public static Date getWeekFromNow() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis( getTimesmorning().getTime()-3600*24*1000*7);
        return cal.getTime();
    }
    // 获得当天24点时间
    public static Date getTimesnight() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 24);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    // 获得本周一0点时间
    public static Date getTimesWeekmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal.getTime();
    }
    // 获得本周日23点时间
    public static Date getTimesWeeknight() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getTimesWeekmorning());
        cal.add(Calendar.DAY_OF_WEEK, 6);
        try {
            cal.setTime(longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return cal.getTime();
    }

    // 获得本月第一天0点时间
    public static Date getTimesMonthmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
        return cal.getTime();
    }

    // 获得本月最后一天23点时间
    public static Date getTimesMonthnight() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, 23);
        try {
            cal.setTime(longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return cal.getTime();
    }

    //获得本季度开始点时间
    public static Date getCurrentQuarterStartTime() {
        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;
        Date now = null;
        try {
            if (currentMonth >= 1 && currentMonth <= 3)
                cal.set(Calendar.MONTH, 0);
            else if (currentMonth >= 4 && currentMonth <= 6)
                cal.set(Calendar.MONTH, 3);
            else if (currentMonth >= 7 && currentMonth <= 9)
                cal.set(Calendar.MONTH, 4);
            else if (currentMonth >= 10 && currentMonth <= 12)
                cal.set(Calendar.MONTH, 9);
            cal.set(Calendar.DATE, 1);
            now = longSdf.parse(shortSdf.format(cal.getTime()) + " 00:00:00");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    /**
     * 当前季度的结束时间,即2012-03-31 23:59:59
     * @return
     */
    public static Date getCurrentQuarterEndTime() {
        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;
        Date now = null;
        try {
            if (currentMonth >= 1 && currentMonth <= 3) {
                cal.set(Calendar.MONTH, 2);
                cal.set(Calendar.DATE, 31);
            } else if (currentMonth >= 4 && currentMonth <= 6) {
                cal.set(Calendar.MONTH, 5);
                cal.set(Calendar.DATE, 30);
            } else if (currentMonth >= 7 && currentMonth <= 9) {
                cal.set(Calendar.MONTH, 8);
                cal.set(Calendar.DATE, 30);
            } else if (currentMonth >= 10 && currentMonth <= 12) {
                cal.set(Calendar.MONTH, 11);
                cal.set(Calendar.DATE, 31);
            }
            now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    //获得本年开始点时间
    public static Date getCurrentYearStartTime() {
        Calendar cal = Calendar.getInstance();
        Date now = null;
        try {
            cal.set(Calendar.MONTH, 0);
            cal.set(Calendar.DATE, 1);
            now = shortSdf.parse(shortSdf.format(cal.getTime()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    //本年的结束时间,即2012-03-31 23:59:59
    public static Date getCurrentYearEndTime() {
        Calendar cal = Calendar.getInstance();
        Date now = null;
        try {
            cal.set(Calendar.MONTH, 11);
            cal.set(Calendar.DATE, 31);
            now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }

    /**
     * 获取前/后半年的开始时间
     *
     * @return
     */
    public static Date getHalfYearStartTime() {
        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;
        Date now = null;
        try {
            if (currentMonth >= 1 && currentMonth <= 6) {
                cal.set(Calendar.MONTH, 0);
            } else if (currentMonth >= 7 && currentMonth <= 12) {
                cal.set(Calendar.MONTH, 6);
            }
            cal.set(Calendar.DATE, 1);
            now = longSdf.parse(shortSdf.format(cal.getTime()) + " 00:00:00");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;

    }

    /**
     * 获取前/后半年的结束时间
     *
     * @return
     */
    public static Date getHalfYearEndTime() {
        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;
        Date now = null;
        try {
            if (currentMonth >= 1 && currentMonth <= 6) {
                cal.set(Calendar.MONTH, 5);
                cal.set(Calendar.DATE, 30);
            } else if (currentMonth >= 7 && currentMonth <= 12) {
                cal.set(Calendar.MONTH, 11);
                cal.set(Calendar.DATE, 31);
            }
            now = longSdf.parse(shortSdf.format(cal.getTime()) + " 23:59:59");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return now;
    }
    
/*****************************  获取上周、上月、上季度、当前半年的上一个半年、上年的开始结束时间 **************************************/

    //获得上年开始点时间
    public static Date getLastYearStartTime() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getCurrentYearStartTime());
        cal.add(Calendar.YEAR, -1);
        return cal.getTime();
    }
    //获得上年开始点时间
    public static Date getLastYearEndTime() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getCurrentYearEndTime());
        cal.add(Calendar.YEAR, -1);
        return cal.getTime();
    }

    //获得当前半年的上半年开始点时间
    public static Date getLastHalfYearStart() {
        Calendar cal = Calendar.getInstance();
        //cal.set(2019, 5, 6); 测试用虚拟时间
        cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 6 - 1) * 6);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return new Timestamp(cal.getTimeInMillis());
    }
    //获得当前半年的上半年结束点时间
    public static Date getLastHalfYearEnd() {
        Calendar cal = Calendar.getInstance();
        //cal.set(2019, 5, 6); 测试用虚拟时间
        cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 6 - 1) * 6 + 5);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
        cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
        cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
        return new Timestamp(cal.getTimeInMillis());
    }

    //获得上季度开始点时间
    public static Date getLastQuarterStart() {
        Calendar cal = Calendar.getInstance();
        //cal.set(2019, 5, 6); //测试用虚拟时间
        cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 3 - 1) * 3);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return new Timestamp(cal.getTimeInMillis());
    }
    //获得上季度结束点时间
    public static Date getLastQuarterEnd() {
        Calendar cal = Calendar.getInstance();
        //cal.set(2019, 5, 6); //测试用虚拟时间
        cal.set(Calendar.MONTH, ((int) cal.get(Calendar.MONTH) / 3 - 1) * 3 + 2);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
        cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
        cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
        return new Timestamp(cal.getTimeInMillis());
    }

    // 获取上月的开始时间
    public static Date getBeginDayOfLastMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(getNowYear(), getNowMonth() - 2, 1);
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new Timestamp(calendar.getTimeInMillis());
    }
    // 获取上月的结束时间
    public static Date getEndDayOfLastMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(getNowYear(), getNowMonth() - 2, 1);
        int day = calendar.getActualMaximum(5);
        calendar.set(getNowYear(), getNowMonth() - 2, day);
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new Timestamp(calendar.getTimeInMillis());
    }

    // 获取上周的开始时间
    public static Date getBeginDayOfLastWeek() {
        Date date = new Date();
        if (date == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
        if (dayofweek == 1) {
            dayofweek += 7;
        }
        cal.add(Calendar.DATE, 2 - dayofweek - 7);
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
                cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return new Timestamp(cal.getTimeInMillis());
    }
    // 获取上周的结束时间
    public static Date getEndDayOfLastWeek() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getBeginDayOfLastWeek());
        cal.add(Calendar.DAY_OF_WEEK, 6);
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
                cal.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        cal.set(Calendar.MILLISECOND, 999);
        return new Timestamp(cal.getTimeInMillis());
    }


    //计算2个日期之间相差的天数main方法
    /*public static void main(String[] args) {
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        try {
            dayCompare(format1.parse("2018-10-14"),new Date());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }*/

    //计算本周、本季等开始结束时间的main方法
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // TODO Auto-generated method stub
        System.out.println("当天24点时间:" + sdf.format(getTimesnight()));
        System.out.println("当前时间:" + new Date().toLocaleString());
        System.out.println("当天0点时间:" + getTimesmorning().toLocaleString());
        System.out.println("昨天0点时间:" + getYesterdaymorning().toLocaleString());
        System.out.println("近7天时间:" + getWeekFromNow().toLocaleString());
        System.out.println("本周周一0点时间:" + getTimesWeekmorning().toLocaleString());
        System.out.println("本周周日23点时间:" + getTimesWeeknight().toLocaleString());
        System.out.println("本月初0点时间:" + getTimesMonthmorning().toLocaleString());
        System.out.println("本月未23点时间:" + getTimesMonthnight().toLocaleString());
        System.out.println("上月初0点时间:" + getLastMonthStartMorning().toLocaleString());
        System.out.println("本季度开始点时间:" + getCurrentQuarterStartTime().toLocaleString());
        System.out.println("本季度结束点时间:" + getCurrentQuarterEndTime().toLocaleString());
        System.out.println("本年开始点时间:" + getCurrentYearStartTime().toLocaleString());
        System.out.println("本年结束点时间:" + getCurrentYearEndTime().toLocaleString());
        System.out.println("上年开始点时间:" + getLastYearStartTime().toLocaleString());
        System.out.println("前/后半年开始时间:" + getHalfYearStartTime().toLocaleString());
        System.out.println("前/后半年结束时间:" + getHalfYearEndTime().toLocaleString());
System.out.println("***************************当前时间上一个时间******************************");
        System.out.println("上年开始时间:" +TimeCalculationUtil.getLastYearStartTime().toLocaleString());
        System.out.println("上年结束时间:" +TimeCalculationUtil.getLastYearEndTime().toLocaleString());
        System.out.println("当前半年的上个半年开始时间:" + TimeCalculationUtil.getLastHalfYearStart().toLocaleString());
        System.out.println("当前半年的上个半年结束时间:" + TimeCalculationUtil.getLastHalfYearEnd().toLocaleString());
        System.out.println("上季度开始时间:" +TimeCalculationUtil.getLastQuarterStart().toLocaleString());
        System.out.println("上季度结束时间:" +TimeCalculationUtil.getLastQuarterEnd().toLocaleString());
        System.out.println("上月开始时间:" +TimeCalculationUtil.getBeginDayOfLastMonth().toLocaleString());
        System.out.println("上月结束时间:" +TimeCalculationUtil.getEndDayOfLastMonth().toLocaleString());
        System.out.println("上周开始时间:" +TimeCalculationUtil.getBeginDayOfLastWeek().toLocaleString());
        System.out.println("上周结束时间:" +TimeCalculationUtil.getEndDayOfLastWeek().toLocaleString());
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值