日期部分相关工具类

package com.jesims.fund.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Month;
import java.util.*;

public class DateUtil {
    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format =new SimpleDateFormat("yyyy-MM-dd");
//        Date fromDate = format.parse("2020-12-12 00:00:00");
        Date fromDate = format.parse("2020-12-12 00:00:00");


        String time = "2021-01-01";
        String time2 = "2021-12-30";
       /* List<String> quarter = getQuarter(time, time2);
        for (int i = 0; i <quarter.size() ; i++) {
            String s = quarter.get(i);
            String year = s.substring(0, 4);
            String quarter1 = s.substring(5, 7);
//            System.out.println(year);
//            System.out.println(quarter1);
            if (quarter1.equals("Q1")){
//                System.out.println(year+"-01-01");
//                System.out.println(year+"-02-28");
                Calendar c = Calendar.getInstance();
                c.setTime(fromDate);
                c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));

                SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
                String last= format2.format(c.getTime());
                System.out.println(last);
                Calendar c2 = Calendar.getInstance(); // this takes current date
                c2.setTime(fromDate);
                c2.set(Calendar.DAY_OF_MONTH, 1);
//                System.out.println(format2.format(c2.getTime()));
//                System.out.println(format2.format(c.getTime())); // this returns java.util.Date
                LocalDate startOrEndDayOfQuarter = getStartOrEndDayOfQuarter(true);
                System.out.println(startOrEndDayOfQuarter);
            }*/
//        }

    }

    /**
     * 获取指定时间段的季度
     * 输出格式:[2021-Q1, 2021-Q2, 2021-Q3, 2021-Q4, 2022-Q1, 2022-Q2, 2022-Q3, 2022-Q4]
     * @param starTime
     * @param endTime
     * @return
     */
    public  List<String> getQuarter(String starTime,String endTime){
//        String time = "2021-01-01";
//        String time2 = "2022-12-30";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date dateTime = null;
        Date dateTime2 = null;
        try {
            dateTime = simpleDateFormat.parse(starTime);
            dateTime2 = simpleDateFormat.parse(endTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        ArrayList<String> quarters = new ArrayList<String>();
        Calendar cal = Calendar.getInstance();
        cal.setTime(dateTime);

        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(dateTime2);

        while (cal1.getTime().after(cal.getTime()) || cal1.getTime().equals(cal.getTime())) {
            int year = cal.get(Calendar.YEAR);
            int month = cal.get(Calendar.MONTH) + 1;

            int quarter = month % 3 == 0 ? (month / 3) : (month / 3) + 1;

            quarters.add(year+"-Q" + quarter);
            cal.add(Calendar.MONTH, 3);
        }
        System.out.println(quarters);
        return  quarters;
    }


    /**
     *  获取两个日期之间的所有月份 输出格式[2016-02, 2016-03, 2016-04, 2016-05, 2016-06, 2016-07,
     *      2016-08, 2016-09, 2016-10, 2016-11, 2016-12, 2017-01]"
     * @param data1
     * @param data2
     * @return
     */
    public   List<String> getYearAndMonth(String data1,String data2){
//        String data1 = "2016-02";// 开始时间
//        String data2 = "2019-12";// 结束时间
        List<String> list = new ArrayList<String>();
        try {
            Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse(data1);
            Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse(data2);

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startDate);
            // 获取开始年份和开始月份
            int startYear = calendar.get(Calendar.YEAR);
            int startMonth = calendar.get(Calendar.MONTH);
            // 获取结束年份和结束月份
            calendar.setTime(endDate);
            int endYear = calendar.get(Calendar.YEAR);
            int endMonth = calendar.get(Calendar.MONTH);
            //

            for (int i = startYear; i <= endYear; i++) {
                String date = "";
                if (startYear == endYear) {
                    for (int j = startMonth; j <= endMonth; j++) {
                        if (j < 9) {
                            date = i + "-0" + (j + 1);
                        } else {
                            date = i + "-" + (j + 1);
                        }
                        list.add(date);
                    }

                } else {
                    if (i == startYear) {
                        for (int j = startMonth; j < 12; j++) {
                            if (j < 9) {
                                date = i + "-0" + (j + 1);
                            } else {
                                date = i + "-" + (j + 1);
                            }
                            list.add(date);
                        }
                    } else if (i == endYear) {
                        for (int j = 0; j <= endMonth; j++) {
                            if (j < 9) {
                                date = i + "-0" + (j + 1);
                            } else {
                                date = i + "-" + (j + 1);
                            }
                            list.add(date);
                        }
                    } else {
                        for (int j = 0; j < 12; j++) {
                            if (j < 9) {
                                date = i + "-0" + (j + 1);
                            } else {
                                date = i + "-" + (j + 1);
                            }
                            list.add(date);
                        }
                    }

                }

            }

            // 所有的月份已经准备好
            //System.out.println(list);
            for(int i = 0;i < list.size();i++){
                System.out.println(list.get(i));

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return  list;
    }

    /**
     * 获取当前日期所在季度的开始日期和结束日期
     * 季度一年四季, 第一季度:1月-3月, 第二季度:4月-6月, 第三季度:7月-9月, 第四季度:10月-12月
     * @param isFirst  true表示查询本季度开始日期  false表示查询本季度结束日期
     * @return
     */
    public static LocalDate getStartOrEndDayOfQuarter(Boolean isFirst){

        LocalDate today=LocalDate.now();
        LocalDate resDate = LocalDate.now();
        if (today == null) {
            today = resDate;
        }
        Month month = today.getMonth();
        Month firstMonthOfQuarter = month.firstMonthOfQuarter();
        Month endMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
        if (isFirst) {
            resDate = LocalDate.of(today.getYear(), firstMonthOfQuarter, 1);
        } else {
            resDate = LocalDate.of(today.getYear(), endMonthOfQuarter, endMonthOfQuarter.length(today.isLeapYear()));
        }
        return resDate;
    }


    public static void getDateTime() throws ParseException{

        Date date = new Date();
        Calendar now = Calendar.getInstance();
        System.out.println("年: " + now.get(Calendar.YEAR));
        System.out.println("月: " + (now.get(Calendar.MONTH) + 1) + "");
        System.out.println("日: " + now.get(Calendar.DAY_OF_MONTH));
        System.out.println("时: " + now.get(Calendar.HOUR_OF_DAY));
        System.out.println("分: " + now.get(Calendar.MINUTE));
        System.out.println("秒: " + now.get(Calendar.SECOND));
        System.out.println("当前时间毫秒数:" + now.getTimeInMillis());
        System.out.println(now.getTime());

        Date d = new Date();
        System.out.println(d);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateNowStr = sdf.format(d);
        System.out.println("格式化后的日期:" + dateNowStr);

        String str = "2012-1-13 17:26:33";    //要跟上面sdf定义的格式一样
        Date today = sdf.parse(str);
        System.out.println("字符串转成日期:" + today);
    }
    /**
     * 获取前x月的日期
     * @param month
     * @return
     */
    public Map<String,String> getNowAndBefore(int month){
        Date now = new Date();
        Date newDate = stepMonth(now, -month);
        Map<String,String> map =new HashMap<>();
        // 现在时间
        map.put("now",DATE_FORMAT.format(now));
        // 之前时间
        map.put("before",DATE_FORMAT.format(newDate));
        return map;
    }
    /**
     * 获取前x月的日期
     * @param month
     * @return (Data类型)
     */
    public  Map<String,Date> getNowAndBeforeData(int month){
        Date now = new Date();
        Date newDate = stepMonth(now, -month);
        Map<String,Date> map =new HashMap<>();
        // 现在时间
        map.put("now",now);
        // 之前时间
        map.put("before",newDate);
        return map;
    }
    /**
     * 获取后x天的日期
     * @param day
     * @return
     */
    public  Map<String,String> getNowAndChangeDay(int day){
        Date now = new Date();
        Date newDate = stepDay(now, day);
        Map<String,String> map =new HashMap<>();
        // 现在时间
        map.put("now",DATE_FORMAT.format(now));
        // 之后时间
        map.put("change",DATE_FORMAT.format(newDate));
        return map;
    }

    /**
     * 在给定的日期加上或减去指定月份后的日期
     * @param sourceDate 原始时间
     * @param month      要调整的月份,向前为负数,向后为正数
     * @return
     */
    public  Date stepMonth(Date sourceDate, int month) {
        Calendar c = Calendar.getInstance();
        c.setTime(sourceDate);
        c.add(Calendar.MONTH, month);
        return c.getTime();
    }
    /**
     * 在给定的日期加上或减去指定月份后的日期
     * @param
     * @param day      要调整的天数,向前为负数,向后为正数
     * @return
     */
    public  Date stepDay(Date sourceDate, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(sourceDate);
        c.add(Calendar.DAY_OF_MONTH, day);
        return c.getTime();
    }






    /**
     * 输出如下:
     * "[2016-02, 2016-03, 2016-04, 2016-05, 2016-06, 2016-07,
     * 2016-08, 2016-09, 2016-10, 2016-11, 2016-12, 2017-01]"
     */
    /**
     * 获取当前系统时间最近12月的年月(含当月)
     * @return
     */
    public  String[] getLatest12Month(){
        String[] latest12Months = new String[12];
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)+1); //要先+1,才能把本月的算进去
        for(int i=0; i<12; i++){
            cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)-1); //逐次往前推1个月
            latest12Months[11-i] = cal.get(Calendar.YEAR)+ "-" +fillZero(cal.get(Calendar.MONTH)+1);
        }
        System.out.println(Arrays.toString(latest12Months));

        return latest12Months;
    }
    public  List<String> getLast12Month(){
        List<String> list =new ArrayList<>();
        String[] latest12Month = getLatest12Month();
        for (int i = 0; i < latest12Month.length; i++) {
            list.add(latest12Month[i]);
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        return  list;
    }


    /**
     * 格式化月份
     */
    public static String fillZero(int i){
        String month = "";
        if(i<10){
            month = "0" + i;
        }else{
            month = String.valueOf(i);
        }
        return month;
    }




    /**
     * 计算两个日期之间相差的天数 (Data类型的日期)
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
     * @throws ParseException
     */
    public  int daysBetweenData(Date smdate,Date bdate) throws ParseException
    {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        smdate=sdf.parse(sdf.format(smdate));
        bdate=sdf.parse(sdf.format(bdate));
        Calendar cal = Calendar.getInstance();
        cal.setTime(smdate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(bdate);
        long time2 = cal.getTimeInMillis();
        long between_days=(time2-time1)/(1000*3600*24);

        return Integer.parseInt(String.valueOf(between_days));
    }

    /**
     *计算两个日期之间相差的天数(String类型的日期)
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
     * @throws ParseException
     */

    public  int daysBetweenString(String smdate,String bdate) {
        Integer day = 0;
        try {
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            Calendar cal = Calendar.getInstance();
            cal.setTime(sdf.parse(smdate));
            long time1 = cal.getTimeInMillis();
            cal.setTime(sdf.parse(bdate));
            long time2 = cal.getTimeInMillis();

            long between_days=(time2-time1)/(1000*3600*24);
            day = Integer.parseInt(String.valueOf(between_days));
        }catch (ParseException e ){
            e.printStackTrace();
        }

        return day;
    }
}

 

posted @ 2022-03-10 09:56  翘中之楚  阅读(24)  评论(0编辑  收藏  举报