获取月,季,周的开始时间和结束时间

本文介绍了一个实用的日期操作工具类,提供了获取指定年月的第一天和最后一天、周开始和结束日期、季度开始和结束日期的方法。同时,文章还涵盖了如何根据年、月、日设置指定时间,日期格式化及解析,获取日期在当前年份中的周数和季度等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

import lombok.extern.slf4j.Slf4j;


@Slf4j
public class MiDateUtil {

    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_YEARMONTH_FORMAT = "yyyy-MM";
    public static final String FORMAT_YYYY = "yyyy";
    public static final String FORMAT_YYYYMM = "yyyyMM";
    public static final String FORMAT_YYYYMMDD = "yyyyMMdd";
    public static final String START_HHMMSS = " 00:00:00";
    public static final String END_HHMMSS = " 23:59:59";

    public static void main(String[] args) {
        log.info("月 开始时间:" + getFirstDayOfMonth(2018, 1));
        log.info("月 结束时间:" + getLastDayOfMonth(2018, 1));
        log.info("周 开始时间:" + getStartDayOfWeekNo(2018, 52));
        log.info("周 结束时间:" + getEndDayOfWeekNo(2018, 52));
        log.info("季 开始时间:" + getStartDayOfSeason(2019, 4));
        log.info("季 结束时间:" + getEndDayOfSeason(2019, 4));
        log.info("-------------------------");
        log.info("周 开始时间:" + getStartDayOfWeekNo(2018, 52, false));
        log.info("周 结束时间:" + getEndDayOfWeekNo(2018, 52, false));
        log.info("季 开始时间:" + getStartDayOfSeason(2019, 4, false));
        log.info("季 结束时间:" + getEndDayOfSeason(2019, 4, false));
    }

    /**
     * 根据某年某月得到最后一天
     *
     * @param year  年
     * @param month 月
     * @return
     */
    public static String getLastDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
        return formatDate(cal.getTime());
    }


    /**
     * 根据某年某月得到第一天
     *
     * @param year  年
     * @param month 月
     * @return
     */
    public static String getFirstDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DATE));
        return formatDate(cal.getTime());
    }

    /**
     * 根据某年第几周得到结束日期
     *
     * @param year   年
     * @param weekNo 第几周
     * @return
     */
    public static String getEndDayOfWeekNo(int year, int weekNo) {
        return getEndDayOfWeekNo(year, weekNo, true);
    }

    /**
     * 根据某年第几周得到结束日期
     *
     * @param year   年
     * @param weekNo 第几周
     * @param hms    是否添加时分秒
     * @return
     */
    public static String getEndDayOfWeekNo(int year, int weekNo, boolean hms) {
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        cal.add(Calendar.DAY_OF_WEEK, 6);
        return hms ? formatDate(cal.getTime()) + END_HHMMSS : formatDate(cal.getTime());
    }

    /**
     * 根据某年第几周得到开始日期
     *
     * @param year   年
     * @param weekNo 第几周
     * @return
     */
    public static String getStartDayOfWeekNo(int year, int weekNo) {
        return getStartDayOfWeekNo(year, weekNo, true);
    }

    /**
     * 根据某年第几周得到开始日期
     *
     * @param year   年
     * @param weekNo 第几周
     * @param hms    是否添加时分秒
     * @return
     */
    public static String getStartDayOfWeekNo(int year, int weekNo, boolean hms) {
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        return hms ? formatDate(cal.getTime()) + START_HHMMSS : formatDate(cal.getTime());
    }

    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 season 第几季(1,2,3,4)
     * @return
     */
    public static String getStartDayOfSeason(int year, int season) {
        return getStartDayOfSeason(year, season, true);
    }

    /**
     * 根据某年第几季得到开始日期
     *
     * @param year   年
     * @param season 第几季(1,2,3,4)
     * @param hms    是否添加时分秒
     * @return
     */
    public static String getStartDayOfSeason(int year, int season, boolean hms) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        if (season == 1) {
            cal.set(Calendar.MONTH, 0);
        } else if (season == 2) {
            cal.set(Calendar.MONTH, 3);
        } else if (season == 3) {
            cal.set(Calendar.MONTH, 6);
        } else if (season == 4) {
            cal.set(Calendar.MONTH, 9);
        }
        cal.set(Calendar.DATE, 1);
        return hms ? formatDate(cal.getTime()) + START_HHMMSS : formatDate(cal.getTime());
    }


    /**
     * 根据某年第几季得到结束日期
     *
     * @param year   年
     * @param season 第几季(1,2,3,4)
     * @return
     */
    public static String getEndDayOfSeason(int year, int season) {
        return getEndDayOfSeason(year, season, true);
    }

    /**
     * 根据某年第几季得到结束日期
     *
     * @param year   年
     * @param season 第几季(1,2,3,4)
     * @param hms    是否添加时分秒
     * @return
     */
    public static String getEndDayOfSeason(int year, int season, boolean hms) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        if (season == 1) {
            cal.set(Calendar.MONTH, 2);
        } else if (season == 2) {
            cal.set(Calendar.MONTH, 5);
        } else if (season == 3) {
            cal.set(Calendar.MONTH, 8);
        } else if (season == 4) {
            cal.set(Calendar.MONTH, 11);
        }
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
        return hms ? formatDate(cal.getTime()) + END_HHMMSS : formatDate(cal.getTime());
    }


    /**
     * 根据传入的年、月、日设置指定时间
     *
     * @param year
     * @param month
     * @param day
     * @return
     */
    public static Date setDate(Integer year, Integer month, Integer day) {
        Calendar calendar = Calendar.getInstance();
        if (year != null) {
            calendar.set(Calendar.YEAR, year);
        }
        if (month != null) {
            calendar.set(Calendar.MONTH, month - 1);
        }
        if (day != null) {
            calendar.set(Calendar.DAY_OF_MONTH, day);
        }
        return calendar.getTime();
    }

    /**
     * 使用指定格式将日期转换为它的字符串表示形式。
     *
     * @param date   日期,非 null。
     * @param format 指定返回格式的字符串。
     * @return 日期的字符串表示形式。
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return null;
        }
        return new SimpleDateFormat(format).format(date);
    }

    public static String formatDate(Date date) {
        return format(date, DEFAULT_DATE_FORMAT);
    }

    public static String formatDateTime(Date date) {
        return format(date, DEFAULT_DATETIME_FORMAT);
    }

    /**
     * 使用指定格式将日期字符串转换为时间。
     *
     * @param dateStr 日期字符串,非 null。
     * @param format  指定日期字符串的格式。
     * @return
     */
    public static Date parse(String dateStr, String format) throws ParseException {
        if (dateStr == null) {
            return null;
        }
        return new SimpleDateFormat(format).parse(dateStr);
    }

    /**
     * 获取传入日期在当前年份中所属周数
     *
     * @param date
     * @return
     */
    public static Integer getWeek4Year(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 设置周期(以年为单位的周期)
     *
     * @param date       指定日期
     * @param weekOfYear
     */
    public static Date setWeek(Date date, Integer weekOfYear) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        if (weekOfYear != null) {
            calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear);
            return calendar.getTime();
        }
        return date;
    }

    /**
     * 获取传入日期在当前年份中所属季度
     *
     * @param date
     * @return
     */
    public static Integer getSeason(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int month = c.get(Calendar.MONTH);
        int season = 0;
        switch (month) {
            case Calendar.JANUARY:
            case Calendar.FEBRUARY:
            case Calendar.MARCH:
                season = 1;
                break;
            case Calendar.APRIL:
            case Calendar.MAY:
            case Calendar.JUNE:
                season = 2;
                break;
            case Calendar.JULY:
            case Calendar.AUGUST:
            case Calendar.SEPTEMBER:
                season = 3;
                break;
            case Calendar.OCTOBER:
            case Calendar.NOVEMBER:
            case Calendar.DECEMBER:
                season = 4;
                break;
            default:
                break;
        }
        return season;
    }

    /**
     * 获取当前日期是本月第几天
     *
     * @param date
     * @return
     */
    public static Integer getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取当前日期的月份
     *
     * @param date
     * @return
     */
    public static Integer getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 获取当前日期的年份
     *
     * @param date
     * @return
     */
    public static Integer getYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值