DateUtil

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;

@Slf4j
public class DateUtils {

    private static final String TIME_END = " 00:00:00";

    /**
     * 距离当前相差
     * @param start
     * @return
     */
    public static String between(long start) {
        StringBuilder builder = new StringBuilder();
        long millis = start - System.currentTimeMillis();
        if (millis < 0) {
            builder.append("超时:");
        }
        Duration between = Duration.ofMillis(Math.abs(millis));
        long days = between.toDays();
        long hours = between.toHours() - days *24;
        long minutes = between.toMinutes() - between.toHours() * 60;
        long seconds = between.getSeconds() - between.toMinutes() * 60;
        builder = days > 0 ? builder.append(days + "天") :builder;
        builder = hours > 0 ? hours > 9 ?builder.append(hours + "时"):builder.append("0" + hours + "时") :builder;
        builder = minutes > 0 ? minutes > 9 ?builder.append(minutes + "分"):builder.append("0" + minutes + "分") :builder;
        builder = seconds > 0 ? seconds > 9 ?builder.append(seconds + "秒"):builder.append("0" + seconds + "秒"):builder;
        return builder.toString();
    }

    /**
     * long格式化为指定格式
     * @param timestamp
     * @return
     */
    public static String format(long timestamp) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()));
    }


    /**
     * Date转换为LocalDateTime
     * @param date
     */
    public static LocalDateTime date2LocalDateTime(Date date){
        try {
            Instant instant = date.toInstant();//An instantaneous point on the time-line.(时间线上的一个瞬时点。)
            ZoneId zoneId = ZoneId.systemDefault();//A time-zone ID, such as {@code Europe/Paris}.(时区)
            LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
            return localDateTime;
        } catch (Exception e) {
            log.error("date2LocalDateTime={}", e);
            return null;
        }
    }


    /**
     * LocalDateTime转换为Date
     * @param localDateTime
     */
    public static Date localDateTime2Date( LocalDateTime localDateTime){
        try {
            ZoneId zoneId = ZoneId.systemDefault();
            ZonedDateTime zdt = localDateTime.atZone(zoneId);
            Date date = Date.from(zdt.toInstant());
            return date;
        } catch (Exception e) {
            log.error("localDateTime2Date={}", e);
            return null;
        }
    }

    /**
     * 将时长转换成时分秒
     * @param countDownTime
     * @return
     */
    public static String getTimeLengthView(long countDownTime) {
        //两个时间点间相差的秒数
        StringBuilder builder = new StringBuilder();

        if (countDownTime <= 0) {
            builder = builder.append("超时");
        } else if (countDownTime < 60) {
            builder = builder.append("<1分钟");
        } else {
            long hours = countDownTime/3600;
            long minutes = (countDownTime - hours * 3600)/60;
            long seconds = countDownTime - hours * 3600 - minutes * 60;
            builder = hours > 0 ? hours > 9 ? builder.append(hours + "时") : builder.append("0" + hours + "时") : builder;
            builder = minutes > 0 ? minutes > 9 ? builder.append(minutes + "分") : builder.append("0" + minutes + "分") : builder;
            //builder = seconds > 0 ? seconds > 9 ? builder.append(seconds + "秒") : builder.append("0" + seconds + "秒") : builder;
            //builder = StringUtils.isBlank(builder) ? builder.append("0秒") : builder;
        }

        return builder.toString();
    }

    /**
     * 获取上一个月的时间 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param startDate
     * @param pattern
     * @param dataFlg
     * @return
     */
    public static String getLastMonthTime(String startDate, String pattern, boolean dataFlg) {
        if (dataFlg) {
            return startDate;
        }
        return getLastMonthTime(startDate, pattern);
    }
    /**
     * 获取上一个月的时间 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param startDate
     * @param pattern
     * @return
     */
    public static String getLastMonthTime(String startDate, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Calendar init = getCalendar(startDate, pattern, sdf);
        init.add(Calendar.MONTH, -1);//当前时间前去一个月,即一个月前的时间
        Date time = init.getTime();
        return sdf.format(time);
    }
    /**
     * 获取上一年的时间  保留原格式
     *      * , 如果 dataFlg 为true 直接返回
     * @param startDate
     * @param pattern
     * @param dataFlg
     * @return
     */
    public static String getLastYearTime(String startDate, String pattern, boolean dataFlg) {
        if (dataFlg) {
            return startDate;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Calendar init = getCalendar(startDate, pattern, sdf);
        init.add(Calendar.YEAR, -1);//当前时间减去一年,即一年前的时间
        Date time = init.getTime();
        return sdf.format(time);
    }
    /**
     * 获取上一年的时间  保留原格式
     *      * , 如果 dataFlg 为true 直接返回
     * @param startDate
     * @param pattern
     * @return
     */
    public static String getLastYearTime(String startDate, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Calendar init = getCalendar(startDate, pattern, sdf);
        init.add(Calendar.YEAR, -1);//当前时间减去一年,即一年前的时间
        Date time = init.getTime();
        return sdf.format(time);
    }
    public static Calendar getCalendar(String startDate, String pattern, SimpleDateFormat sdf) {
        Calendar init = Calendar.getInstance();
        Date parse = null;
        try {
            parse = sdf.parse(startDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        init.setTime(parse);
        return init;
    }

    /**
     * 获取上一年的时间  2019年第1季度 格式 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param time
     * @return
     */
    public static String getLastYearTimeSeason(String time) {
        if (StringUtils.isEmpty(time)) {
            return "";
        }
        String year = StringUtils.substringBefore(time, "年");
        Integer lastYear = Integer.valueOf(year) - 1;
        if (lastYear <=0) {
            return "";
        }
        return lastYear.toString()  + "年" +  StringUtils.substringAfter(time, "年");
    }
    /**
     * 获取上一年的时间  2019年第1季度 格式 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param time
     * @param dataFlg
     * @return
     */
    public static String getLastYearTimeSeason(String time, boolean dataFlg) {
        if (dataFlg) {
            return time;
        }
        return getLastYearTimeSeason(time);
    }
    /**
     * 获取上一月的时间  2019年第1季度 格式 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param time
     * @param dataFlg
     * @return
     */
    public static String getLastMonthTimeSeason(String time, boolean dataFlg) {
        if (dataFlg) {
            return time;
        }
        return getLastMonthTimeSeason(time);
    }
    /**
     * 获取上一月的时间  2019年第1季度 格式 保留原格式
     * , 如果 dataFlg 为true 直接返回
     * @param time
     * @return
     */
    public static String getLastMonthTimeSeason(String time) {
        if (StringUtils.isEmpty(time)) {
            return "";
        }
        String season = StringUtils.substringBetween(time, "第", "季度");
        Integer lastSeason = Integer.valueOf(season) - 1;
        if (lastSeason ==0) {
            String year = StringUtils.substringBefore(time, "年");
            Integer lastYear = Integer.valueOf(year) - 1;
            if (lastYear <=0) {
                return "";
            }
            return lastYear.toString() + "年第4季度";
        } else if (lastSeason < 0) {
            return "";
        }
        return  StringUtils.substringBefore(time, "年") + "年第" + lastSeason + "季度";
    }

    public static Integer secondToHour(Object num) {
        if (null == num) {
            return 0;
        }
        BigDecimal divide = null;
        if (num instanceof BigDecimal) {
            divide = ((BigDecimal) num).divide(BigDecimal.valueOf(3600), 1, BigDecimal.ROUND_HALF_UP);
        }
        if (num instanceof Integer) {
            divide = BigDecimal.valueOf((Integer) num).divide(BigDecimal.valueOf(3600), 1, BigDecimal.ROUND_HALF_UP);
        }
        return divide.intValue();
    }

    /**
     * 秒 转 分钟
     * @param num
     * @return
     */
    public static Integer secondToMinutes(Object num) {
        if (null == num) {
            return 0;
        }
        BigDecimal divide = null;
        if (num instanceof BigDecimal) {
            divide = ((BigDecimal) num).divide(BigDecimal.valueOf(60), 1, BigDecimal.ROUND_HALF_UP);
        }
        if (num instanceof Integer) {
            divide = BigDecimal.valueOf((Integer) num).divide(BigDecimal.valueOf(60), 1, BigDecimal.ROUND_HALF_UP);
        }
        return divide.intValue();
    }
    /**
     * 获取当前 时间 下个月的第一天
     */
    public  static String getNextMonthTimeFirstDay(){

        LocalDate date = LocalDate.now();
        LocalDate firstday = date.with(TemporalAdjusters.firstDayOfNextMonth());
        String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return format + TIME_END;
    }
    /**
     * 获取当前 时间 下个季度的第一天
     */
    public  static String getNextQuarterTimeFirstDay(){
        LocalDate date = LocalDate.now();
        // LocalDate date = LocalDate.of(2020, d, 1);
        // 123 456 789   10 11 12
        int month = date.getMonth().getValue();
        int del = month%3 == 0 ? 3 : month%3;
        int plus = 4 - del ;;
        LocalDate localDate = date.plusMonths(plus);
        LocalDate firstday = localDate.with(TemporalAdjusters.firstDayOfMonth());
        String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return format + TIME_END;
    }
    /**
     * 获取当前 时间 下个年度的第一天
     */
    public  static String getNextYearTimeFirstDay(){

        LocalDate date = LocalDate.now();
        LocalDate firstday = date.with(TemporalAdjusters.firstDayOfNextYear());
        String format = firstday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return format + TIME_END;
    }
    /**
     * 获取当前 时间 下周的第一天
     */
    public  static String getNextWeekTimeFirstDay() {

        LocalDate today = LocalDate.now();
        LocalDate monDay = today.with(DayOfWeek.MONDAY);
        LocalDate nextWeek = monDay.plus(1, ChronoUnit.WEEKS);    //使用变量赋值
        return nextWeek + TIME_END;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值