DateUtil.java 12.6 KB
package com.skua.modules.guest.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Stream;

/**
 * @author sonin
 * @date 2021/8/18 11:34
 */
public class DateUtil {

    private static DateUtil dateUtil;

    public static DateUtil getInstance() {
        if (dateUtil == null) {
            synchronized (DateUtil.class) {
                if (dateUtil == null) {
                    dateUtil = new DateUtil();
                }
            }
        }
        return dateUtil;
    }


    /***
     * 计算年龄
     * @param birthdate
     * @return
     */
    public static int calculateAge(Date birthdate) {
        LocalDate now = LocalDate.now();
        LocalDate dob = birthdate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

        Period period = Period.between(dob, now);
        int age = period.getYears();

        return age;
    }
    /**
     * 转化日期格式
     * @param dateString  要转换的日期字符串
     * @param format  转换后的格式 默认 yyyy-MM-dd
     * @return
     */
    public String convertDateFormat(String  dateString ,String format){
        // 使用 SimpleDateFormat 来定义你想要的日期格式
        SimpleDateFormat formatter = null;

        String formattedDate = null;
        try {
            if(format != null && format.length() >0 ){
                formatter = new SimpleDateFormat(format);
            }else{
                formatter = new SimpleDateFormat("yyyy-MM-dd");
            }
            if(dateString != null && dateString.length() > 0){
                // 将日期字符串转换为 Date 对象
                Date date = formatter.parse(dateString);
                // 再将 Date 对象格式化为字符串
                formattedDate = formatter.format(date);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return formattedDate;
    }

    public String convertDateFormat(Date  date ,String format){
        // 使用 SimpleDateFormat 来定义你想要的日期格式
        SimpleDateFormat formatter = null;

        String formattedDate = null;
        try {
            if(format != null && format.length() >0 ){
                formatter = new SimpleDateFormat(format);
            }else{
                formatter = new SimpleDateFormat("yyyy-MM-dd");
            }
            // 将日期字符串转换为 Date 对象
            // 再将 Date 对象格式化为字符串
            formattedDate = formatter.format(date);
            // 输出结果
            //System.out.println(formattedDate); // 输出: 2024-08-19

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


    /***
     * 获取两个时间的日期
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDaysBetween(String start, String end,String format) {
        List<String> days = new ArrayList<>();
        if(format == null ){
            format = "yyyy-MM-dd";
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        // 解析日期
        LocalDate startDate = LocalDate.parse(start, formatter);
        LocalDate endDate = LocalDate.parse(end, formatter);
        LocalDate currentDate = LocalDate.now();//创建一个LocalData对象获取当前日期
        if(endDate.isAfter( currentDate)){
            endDate = currentDate;
        }
        long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
        for (int i = 0; i <= numOfDaysBetween; i++) {
            LocalDate date = startDate.plusDays(i);
            days.add(date.toString()); // 格式化为 yyyy-MM
        }
        return days;
    }
    /***
     * 获取两个时间的月份
     * @param start
     * @param end
     * @return
     */
    public static List<String> getMonthsBetween(String start, String end,String format) {
        if(format == null ){
            format = "yyyy-MM-dd";
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        // 解析日期
        LocalDate startDate = LocalDate.parse(start, formatter);
        LocalDate endDate = LocalDate.parse(end, formatter);
        LocalDate currentDate = LocalDate.now();//创建一个LocalData对象获取当前日期
        if(endDate.isAfter( currentDate)){
            endDate = currentDate;
        }
        List<String> months = new ArrayList<>();
        // 获取起始和结束月份
        YearMonth startMonth = YearMonth.from(startDate);
        YearMonth endMonth = YearMonth.from(endDate);
        // 遍历月份并添加到列表
        YearMonth currentMonth = startMonth;
        while (!currentMonth.isAfter(endMonth)) {
            months.add(currentMonth.toString()); // 格式化为 yyyy-MM
            currentMonth = currentMonth.plusMonths(1);
        }
        return months;
    }

    /**
     *  获取两个日期之间的所有日期 (年月日)
     *
     * @param startTime
     * @param endTime
     * @return
     */
    public static List<String> getBetweenDate(String startTime, String endTime,String format){
        if(format == null ){
            format = "yyyy-MM-dd";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        SimpleDateFormat formatSDF = new SimpleDateFormat(format);
        // 声明保存日期集合
        List<String> list = new ArrayList<String>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            Date currentDate = new Date();
            if(currentDate.getTime() < endDate.getTime() ){
                endDate = currentDate;
            }
            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()){
                // 把日期添加到集合
                list.add(formatSDF.format(startDate));
                // 设置日期
                calendar.setTime(startDate);
                //把日期增加一天
                calendar.add(Calendar.DATE, 1);
                // 获取增加后的日期
                startDate=calendar.getTime();
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 获取7天日期数据,并指定显示格式
     * @param dateFormat
     * @return
     */
    public List<String> get7Day(String dateFormat) {
        if(dateFormat == null ){
            dateFormat = "yyyy-MM-dd";
        }
        LocalDate today = LocalDate.now();
        List<String> dates = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);

        for (int i = 0; i < 7; i++) {
            LocalDate date = today.minusDays(i);
            dates.add(date.format(formatter));
        }
        return dates;
    }

    /**
     * 获取今天日期
     *
     * @return
     */
    public String getToday() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        return simpleDateFormat.format(calendar.getTime());
    }

    /**
     * 获取本周每天的日期
     *
     * @return
     */
    public List<String> getWeek() {
        List<String> weekList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        // 今天是一周中的第几天
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        if (calendar.getFirstDayOfWeek() == Calendar.SUNDAY) {
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        // 计算一周开始的日期
        calendar.add(Calendar.DAY_OF_MONTH, -dayOfWeek);
        for (int i = 1; i <= 7; i++) {
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            weekList.add(simpleDateFormat.format(calendar.getTime()));
        }
        return weekList;
    }

    public List<String> getMonth() {
        List<String> monthList = new ArrayList<>();
        Calendar calendar = Calendar.getInstance(Locale.CHINA);
        int year = calendar.get(Calendar.YEAR); //年份
        int month = calendar.get(Calendar.MONTH) + 1; //月份
        int day = calendar.getActualMaximum(Calendar.DATE);
        for (int i = 1; i <= day; i++) {
            StringBuilder stringBuilder = new StringBuilder().append(year).append("-");
            if (month < 10) {
                stringBuilder.append(0).append(month).append("-");
            } else {
                stringBuilder.append(month).append("-");
            }
            if (i < 10) {
                stringBuilder.append(0).append(i);
            } else {
                stringBuilder.append(i);
            }
            monthList.add(stringBuilder.toString());
        }
        return monthList;
    }

    public Integer getYear() {
        Calendar calendar = Calendar.getInstance();
        // e.g: 2021
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 根据年月获取对应的月份天数
     **/
    private int getDaysByYearMonth(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DATE, 1);
        calendar.roll(Calendar.DATE, -1);
        return calendar.get(Calendar.DATE);
    }

    /**
     * String => java.util.Date
     *
     * @param str        表示日期的字符串
     * @param dateFormat 传入字符串的日期表示格式(如:"yyyy-MM-dd HH:mm:ss")
     * @return java.util.Date类型日期对象(如果转换失败则返回null)
     */
    public static Date strToDate(String str, String dateFormat) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
        Date date = null;
        try {
            date = simpleDateFormat.parse(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * Date -> LocalDateTime
     * @param date
     * @return
     */
    public static LocalDateTime dateToLocalDateTime(Date date){
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /***
     * 获取当前时间
     * @return
     */
    public static String  getCurrentDate(){
        return  formatDate(new Date(),null);
    }

    /***
     * 字符串日期格式化
     * @param date
     * @param format
     * @return
     */
    public static String formatDate(String date , String format){
        if(format == null ){
            format = "yyyy-MM-dd";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        SimpleDateFormat formatSDF = new SimpleDateFormat(format);
        // 转化成日期类型
        try {
            Date startDate = sdf.parse(date);
            date = formatSDF.format(startDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    public  static  String formatDate(Date dateTime , String format){
        if(format == null ){
            format = "yyyy-MM-dd";
        }
        String date = "";
        SimpleDateFormat formatSDF = new SimpleDateFormat(format);
        // 转化成日期类型
        try {
            date = formatSDF.format(dateTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }


    /**
     * 格式化
     * @param date
     * @param format
     * @return
     */
    public static String dateformat(String date, String format) {
        SimpleDateFormat sformat = new SimpleDateFormat(format);
        Date _date = null;
        try {
            _date = sformat.parse(date);
        } catch (ParseException var5) {
            var5.printStackTrace();
        }
        return sformat.format(_date);
    }

    /***
     * 两个时间差
     * @param date1
     * @param date2
     * @return
     */
    public static int differenceTime(String  date1,String date2){
        int daysDifference = 1;
        try{
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            // 计算两个日期之间的差值
            daysDifference = org.apache.commons.lang3.time.DateUtils.toCalendar( sdf.parse(date2)).get(Calendar.DAY_OF_YEAR)
                    - org.apache.commons.lang3.time.DateUtils.toCalendar( sdf.parse(date1)).get(Calendar.DAY_OF_YEAR); // 直接计算天数差值
        }catch(Exception e){
            e.printStackTrace();
        }
        return daysDifference;
    }
}