根据指定时间获取时间(日,周,月,季度,年)

package Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * TODO
 *
 * @author biao
 * @date 2022-09-14
 */
public class Demo获取时间 {
    public static void main(String[] args) throws Exception {
//        String time = "2022-09-07";
//        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
//        Date date = sdf.parse(time);
        //日
        System.out.println("下面是日时间");
        System.out.println(pastDay("2022-9-11"));
        //周
        System.out.println("下面是周时间");
//        System.out.println(getShangzhouTime(date,3));
        System.out.println(getManShangZhouTime("2022-9-18", 5));
//        System.out.println("=========");
        //月
        System.out.println("下面是月时间");
        System.out.println(getManShangYueTime("2022-9-11", 12).toString());
//        System.out.println("=========");

        //季
        System.out.println("下面是季度时间");
        System.out.println(testQuarter("2022-9-11", 4));
        //年
        System.out.println("下面是年时间");
        System.out.println(testYear("2022-9-11", 5));
    }

    //测试年份
    public static String testYear(String time, int count) {
        ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
        //我这里传来的时间是个string类型的,所以要先转为date类型的。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(time);
            for (int i = count; i > 0; i--) {
                pastDaysList.add(getLastYear(date, i));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return pastDaysList.toString();
    }

    /**
     * 获取上一年年份
     *
     * @return
     */
    public static Map<String, Object> getLastYear(Date date, int count) {
        SimpleDateFormat formats = new SimpleDateFormat("yyyy");
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.YEAR, -count);
        Date time = c.getTime();
        // Date类型转String类型
        String format = formats.format(time);
        Map<String, Object> timeMap = new HashMap<>();
        timeMap.put("startTime", format + "-01-01 00:00:00");
        timeMap.put("endTime", format + "-12-31 24:00:00");
        return timeMap;
    }


    //季度测试
    public static String testQuarter(String time, int count) {
        ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
        //我这里传来的时间是个string类型的,所以要先转为date类型的。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(time);
            for (int i = count; i > 0; i--) {
                pastDaysList.add(getLastQuarter(date, i));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return pastDaysList.toString();
    }

    /**
     * 前多少个季度
     *
     * @param date
     * @param count
     * @return
     */
    public static Map<String, Object> getLastQuarter(Date date, int count) {
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(date);
        startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3 - (count * 3) + 3);
        startCalendar.set(Calendar.DAY_OF_MONTH, 1);
        setMinTime(startCalendar);

        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(date);
        endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2 - (count * 3) + 3);
        endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        setMaxTime(endCalendar);

        Map<String, Object> timeMap = new HashMap<>();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String start = formatter.format(startCalendar.getTime());
        String end = formatter.format(endCalendar.getTime());
        timeMap.put("startTime", start + " 00:00:00");
        timeMap.put("endTime", end + " 24:00:00");
        return timeMap;
    }

    /**
     * 季度最小时间
     *
     * @param calendar
     */
    private static void setMinTime(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    }

    /**
     * 季度最大时间
     *
     * @param calendar
     */
    private static void setMaxTime(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
        calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
    }

    //测试周报
    public static String getManShangZhouTime(String time, int count) {
        ArrayList<String> pastDaysList = new ArrayList<>();
        //我这里传来的时间是个string类型的,所以要先转为date类型的。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(time);
            for (int i = count; i > 0; i--) {
                String daytime = getShangzhouTime(date, i);
                pastDaysList.add(daytime);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return pastDaysList.toString();
    }

    //周报
    public static String getShangzhouTime(Date date, int count) {
        Calendar calendar1 = Calendar.getInstance();
        Calendar calendar2 = Calendar.getInstance();
        calendar1.setTime(date);
        calendar2.setTime(date);
        int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1;
        int offset1 = 1 - dayOfWeek;
        int offset2 = 7 - dayOfWeek;
        if (dayOfWeek != 0) {
            calendar1.add(Calendar.DATE, offset1 - (7 * count));
            calendar2.add(Calendar.DATE, offset2 - (7 * count));
        } else {
            calendar1.add(Calendar.DATE, offset1 - (7 * count) - 7);
            calendar2.add(Calendar.DATE, offset2 - (7 * count) - 7);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String lastBeginDate = sdf.format(calendar1.getTime());
        String lastEndDate = sdf.format(calendar2.getTime());
        return lastBeginDate + "至" + lastEndDate;
    }

    //测试月报
    public static String getManShangYueTime(String time, int count) {
        ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
        Map<String, Object> timeMap = new HashMap<>();
        //我这里传来的时间是个string类型的,所以要先转为date类型的。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(time);
            for (int i = count; i > 0; i--) {
                timeMap = getShangyueTime(date, i);
                pastDaysList.add(timeMap);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return pastDaysList.toString();
    }

    //月报
    public static Map<String, Object> getShangyueTime(Date date, int count) {
        Map<String, Object> map = new HashMap<>();
        Calendar cale = Calendar.getInstance();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        cale.setTime(date);
        cale.add(Calendar.MONTH, -(count));
        cale.set(Calendar.DAY_OF_MONTH, 1);
        // 当月第一天 2019-02-01
        String firstDayOfMonth = formatter.format(cale.getTime());
        cale.add(Calendar.MONTH, 1);
        cale.set(Calendar.DAY_OF_MONTH, 0);
        // 当月最后一天 2019-02-28
        String lastDayOfMonth = formatter.format(cale.getTime());
        map.put("startTime", firstDayOfMonth + " 00:00:00");
        map.put("endTime", lastDayOfMonth + " 24:00:00");
        return map;
    }
//

    /**
     * 获取过去第几天的日期
     *
     * @param past
     * @return
     */
    public static String getPastDate(int past, Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
        Date today = calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String result = sdf.format(today);
        return result;
    }

    /**
     * 获取过去7天内的日期数组
     *
     * @return 日期数组
     */
    public static ArrayList<String> pastDay(String time) {
        ArrayList<String> pastDaysList = new ArrayList<>();
        try {
            //我这里传来的时间是个string类型的,所以要先转为date类型的。
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(time);
            for (int i = 7; i >= 1; i--) {
                pastDaysList.add(getPastDate(i, date));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return pastDaysList;
    }


}

测试结果

可以指定某个时间 的前多少日,周,月,季,年

下面是日时间
[2022-06-26, 2022-06-27, 2022-06-28, 2022-06-29, 2022-06-30, 2022-07-01, 2022-07-02]
下面是周时间
[2022-08-08至2022-08-14, 2022-08-15至2022-08-21, 2022-08-22至2022-08-28, 2022-08-29至2022-09-04, 2022-09-05至2022-09-11, 2022-09-12至2022-09-18]
下面是月时间
[{startTime=2021-09-01 00:00:00, endTime=2021-09-30 24:00:00}, {startTime=2021-10-01 00:00:00, endTime=2021-10-31 24:00:00}, {startTime=2021-11-01 00:00:00, endTime=2021-11-30 24:00:00}, {startTime=2021-12-01 00:00:00, endTime=2021-12-31 24:00:00}, {startTime=2022-01-01 00:00:00, endTime=2022-01-31 24:00:00}, {startTime=2022-02-01 00:00:00, endTime=2022-02-28 24:00:00}, {startTime=2022-03-01 00:00:00, endTime=2022-03-31 24:00:00}, {startTime=2022-04-01 00:00:00, endTime=2022-04-30 24:00:00}, {startTime=2022-05-01 00:00:00, endTime=2022-05-31 24:00:00}, {startTime=2022-06-01 00:00:00, endTime=2022-06-30 24:00:00}, {startTime=2022-07-01 00:00:00, endTime=2022-07-31 24:00:00}, {startTime=2022-08-01 00:00:00, endTime=2022-08-31 24:00:00}]
下面是季度时间
[{startTime=2021-07-01 00:00:00, endTime=2021-09-30 24:00:00}, {startTime=2021-10-01 00:00:00, endTime=2021-12-31 24:00:00}, {startTime=2022-01-01 00:00:00, endTime=2022-03-31 24:00:00}, {startTime=2022-04-01 00:00:00, endTime=2022-06-30 24:00:00}]
下面是年时间
[{startTime=2017-01-01 00:00:00, endTime=2017-12-31 24:00:00}, {startTime=2018-01-01 00:00:00, endTime=2018-12-31 24:00:00}, {startTime=2019-01-01 00:00:00, endTime=2019-12-31 24:00:00}, {startTime=2020-01-01 00:00:00, endTime=2020-12-31 24:00:00}, {startTime=2021-01-01 00:00:00, endTime=2021-12-31 24:00:00}]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值