mitao
2025-04-07 18891c60ab1c06a4acc85d0ec54dee50d1b1a19f
finance-common/src/main/java/com/finance/common/utils/DateUtils.java
@@ -1,6 +1,7 @@
package com.finance.common.utils;
import cn.hutool.core.convert.NumberChineseFormatter;
import cn.hutool.core.date.DateUtil;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -206,14 +207,14 @@
    public static Map<String, Date> getMonthDate(Date date) {
        Map<String, Date> map = new HashMap<>(2);
        Calendar cal = Calendar.getInstance();
        //设置指定日期
        // 设置指定日期
        cal.setTime(date);
        //获取当月第一天日期
        // 获取当月第一天日期
        int first = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, first);
        Date firstDay = cal.getTime();
        map.put("first", firstDay);
        //获取当月最后一天日期
        // 获取当月最后一天日期
        int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, last);
        Date lastDay = cal.getTime();
@@ -279,14 +280,14 @@
    public static Map<String, Date> getYearDate(Date date) {
        Map<String, Date> map = new HashMap<>(2);
        Calendar cal = Calendar.getInstance();
        //设置指定日期
        // 设置指定日期
        cal.setTime(date);
        //获取本年第一天日期
        // 获取本年第一天日期
        int first = cal.getActualMinimum(Calendar.DAY_OF_YEAR);
        cal.set(Calendar.DAY_OF_YEAR, first);
        Date firstDay = cal.getTime();
        map.put("first", firstDay);
        //获取本年最后一天日期
        // 获取本年最后一天日期
        int last = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
        cal.set(Calendar.DAY_OF_YEAR, last);
        Date lastDay = cal.getTime();
@@ -376,12 +377,44 @@
     * @throws Exception 异常
     */
    public static String getNowQuarter() throws Exception {
        //当前所在季度
        // 当前所在季度
        Date date = new Date();
        char quarterOfYear = String.valueOf(getQuarterOfYear(date)).toCharArray()[0];
        String quarterOfYearStr = NumberChineseFormatter.numberCharToChinese(quarterOfYear, false);
        // char quarterOfYear = String.valueOf(getQuarterOfYear(date)).toCharArray()[0];
        int quarterOfYear = DateUtil.quarter(date);
        String quarterOfYearStr = NumberChineseFormatter.numberCharToChinese((char) quarterOfYear,
                false);
        LocalDate now = LocalDate.now();
        return String.format("%s年%s季度", now.getYear(), quarterOfYearStr);
    }
    /**
     * 获取上一季度字符串
     *
     * @return 当前季度字符串
     * @throws Exception 异常
     */
    public static String getPreviousQuarter() throws Exception {
        // 当前日期
        LocalDate now = LocalDate.now();
        // 当前月份
        int currentMonth = now.getMonthValue();
        // 计算上季度的月份
        int previousQuarterMonth = currentMonth - 3;
        int previousQuarterYear = now.getYear();
        if (previousQuarterMonth <= 0) {
            previousQuarterMonth += 12;
            previousQuarterYear -= 1;
        }
        // 计算上季度的季度数
        int previousQuarter = (previousQuarterMonth - 1) / 3 + 1;
        // 将季度数转换为汉字
        String quarterOfYearStr = NumberChineseFormatter.numberCharToChinese(
                (char) (previousQuarter + '0'), false);
        // 返回上季度的年份和季度
        return String.format("%s年%s季度", previousQuarterYear, quarterOfYearStr);
    }
    public static Date getQuarterDate(String quarter) {
@@ -409,15 +442,65 @@
        return DateUtils.toDate(startDate);
    }
    //测试 getNowQuarter
    public static Date getQuarterDateEnd(String quarter) {
        // 提取年份和季度信息
        int year = Integer.parseInt(quarter.substring(0, 4));
        int quarterNumber = NumberChineseFormatter.chineseToNumber(quarter.substring(5, 6)); // 季度数字
        // 计算季度初的日期
        LocalDate startDate;
        switch (quarterNumber) {
            case 1:
                startDate = LocalDate.of(year, 3, 1);
                break;
            case 2:
                startDate = LocalDate.of(year, 6, 1);
                break;
            case 3:
                startDate = LocalDate.of(year, 9, 1);
                break;
            case 4:
                startDate = LocalDate.of(year, 12, 1);
                break;
            default:
                throw new IllegalArgumentException("Invalid quarter number: " + quarterNumber);
        }
        return DateUtils.toDate(startDate);
    }
    // 测试 getNowQuarter
    public static void main(String[] args) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowQuarter = getNowQuarter();
        System.out.println(nowQuarter);
        System.out.println(NumberChineseFormatter.chineseToNumber("一"));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年一季度")));
        System.out.println(simpleDateFormat.format(getQuarterDateEnd("2024年一季度")));
        String month = DateUtil.format(getQuarterDateEnd("2024年一季度"), "MM");
        System.out.println(Double.parseDouble(month));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年二季度")));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年三季度")));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年四季度")));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年四季度")));
        System.out.println(
                DateUtil.format(getQuarterDateEnd(getPreviousQuarter()), "yyyy-MM-dd HH:mm:ss"));
        System.out.println(
                DateUtil.format(getQuarterDate(getPreviousQuarter()), "yyyy-MM-dd HH:mm:ss"));
        System.out.println(getLastYearQuarter("2024年四季度"));
    }
    public static String getLastYearQuarter(String previousQuarter) {
        // 提取年份和季度信息
        String year = previousQuarter.substring(0, 4);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        try {
            // 今年
            Date date = sdf.parse(year);
            // 根据date获取去年的日期
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.YEAR, -1);
            Date lastYear = calendar.getTime();
            return String.format("%s年%s", sdf.format(lastYear), previousQuarter.substring(5));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}