Java 8 时间操作工具类有需要的拿走

时间转换工具类

项目中是经常需要使用,废话不多说,直接上代码

package com.study;

import lombok.extern.slf4j.Slf4j;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalUnit;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.time.temporal.ChronoUnit.MILLIS;
import static org.springframework.util.StringUtils.hasText;

/**
 * @Package: com.study
 * @Description: <时间操作工具>
 * @Author: MILLA
 * @CreateDate: 2018/5/4 16:02
 * @UpdateUser: MILLA
 * @UpdateDate: 2018/5/4 16:02
 * @UpdateRemark: <>
 * @Version: 1.0
 */
@Slf4j
public final class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    public static final String YEAR_MONTH_DAY_I = "yyyy/MM/dd";
    public static final String YEAR_MONTH_DAY_M = "yyyy-MM-dd";
    public static final String YEAR_MONTH_DAY_ZH = "yyyy年MM月dd日";
    public static final String MONTH_ZH = "M月";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_I = "yyyy/MM/dd HH:mm:ss";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_M = "yyyy-MM-dd HH:mm:ss";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_NONE = "yyyyMMddHHmmss";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_SSS_NONE = "yyyyMMddHHmmssSSS";
    public static final String YEAR_MONTH_DAY_HH_MM_I = "yyyy/MM/dd HH:mm";
    public static final String YEAR_MONTH_DAY_HH_MM_M = "yyyy-MM-dd HH:mm";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_SSS_I = "yyyy/MM/dd HH:mm:ss.SSS";
    public static final String YEAR_MONTH_DAY_HH_MM_SS_SSS_M = "yyyy-MM-dd HH:mm:ss.SSS";
    private static final String WEB_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";


    //测试可删除
    public static void main(String[] args) {
        System.out.println(previousMonthFirstDay(System.currentTimeMillis()));
        System.out.println(previousMonthLastDay(System.currentTimeMillis()));

        Date date = previousMonthFirstDay(1592972481000L);
        String format = format(YEAR_MONTH_DAY_HH_MM_SS_M, date);
        System.out.println(format);
        Date date1 = previousMonthLastDay(1592972481000L);
        String format1 = format(YEAR_MONTH_DAY_HH_MM_SS_M, date1);
        System.out.println(format1);

        String s = formatPreviousMonth(1606796481000L, null);
        System.out.println(s);
        System.out.println(formatMonth(1606796481000L, null));

    }

    public static String formatCurrentDateTime() {
        return formatCurrentDateTime(null);
    }


    /**
     * 对给定时间进行时间的加减操作
     *
     * @param now         指定时间
     * @param amountToAdd 增加的数量
     * @param unit        增加的单位
     * @return
     */
    public static Date plus(Date now, Long amountToAdd, TemporalUnit unit) {
        LocalDateTime nowDateTime = now.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime plus = nowDateTime.plus(amountToAdd, unit);
        Instant instant = plus.atZone(ZoneId.systemDefault()).toInstant();
        return Date.from(instant);
    }

    /**
     * 对给定时间进行时间的加减操作
     *
     * @param now         指定时间
     * @param amountToAdd 增加的数量
     * @param unit        增加的单位
     * @return
     */
    public static Date plus(Long now, Long amountToAdd, TemporalUnit unit) {
        return plus(new Date(now), amountToAdd, unit);
    }

    /**
     * 格式化当前时间
     *
     * @param pattern 指定格式
     * @return 时间字符串输出
     */
    public static String formatCurrentDateTime(String pattern) {
        LocalDate now = LocalDate.now();
        return format(pattern, now);
    }

    /**
     * 获取当前月份第一天
     *
     * @return 日期的字符串格式输出
     */
    public static String formatCurrentMonthFirstDay() {
        return formatCurrentMonthFirstDay(null);
    }

    /**
     * 获取当前月份最后一天
     *
     * @return 日期的字符串格式输出
     */
    public static String formatCurrentMonthLastDay() {
        return formatCurrentMonthLastDay(null);
    }

    /**
     * 获取前一月第一天
     *
     * @return 日期的字符串格式输出
     */
    public static String formatPreviousMonthFirstDay() {
        return formatPreviousMonthFirstDay(null);
    }

    /**
     * 获取前一个月最后一天
     *
     * @return 日期的字符串格式输出
     */
    public static String formatPreviousMonthLastDay() {
        return formatPreviousMonthLastDay(null);
    }

    /**
     * 获取前一个月第一天[从凌晨开始]
     *
     * @return 日期的字符串格式输出
     */
    public static Date previousMonthFirstDay() {
        LocalDate today = LocalDate.now();
        //本月的第一天
        LocalDate localDate = LocalDate.of(today.getYear(), today.getMonth().plus(-1), 1);
        ZonedDateTime dateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(dateTime.toInstant());
    }

    /**
     * 获取前一个月第一天[从凌晨开始]
     *
     * @param timestamps 指定时间戳
     * @return 日期的字符串格式输出
     */
    public static Date previousMonthFirstDay(long timestamps) {
        Date date = new Date(timestamps);
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDate now = localDateTime.toLocalDate();
        //本月的第一天
        LocalDate localDate = LocalDate.of(now.getYear(), now.getMonth().plus(-1), 1);
        ZonedDateTime dateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(dateTime.toInstant());
    }

    /**
     * 获取前一个月最后一天[下一个凌晨前一秒结束]
     *
     * @return 日期的字符串格式输出
     */
    public static Date previousMonthLastDay() {
        LocalDate today = LocalDate.now();
        //本月的第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth(), 1);
        ZonedDateTime dateTime = firstDay.atStartOfDay(ZoneId.systemDefault());
        Instant plus = dateTime.toInstant().plus(-1, MILLIS);
        return Date.from(plus);
    }

    /**
     * 获取前一个月最后一天[下一个凌晨前一秒结束]
     *
     * @param timestamps 指定时间戳
     * @return 日期的字符串格式输出
     */
    public static Date previousMonthLastDay(long timestamps) {
        Date date = new Date(timestamps);
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDate now = localDateTime.toLocalDate();
        //本月的第一天
        LocalDate firstDay = LocalDate.of(now.getYear(), now.getMonth(), 1);
        ZonedDateTime dateTime = firstDay.atStartOfDay(ZoneId.systemDefault());
        Instant plus = dateTime.toInstant().plus(-1, MILLIS);
        return Date.from(plus);
    }

    /**
     * 获取当前时间前一个月月份
     *
     * @param timestamps 指定时间戳
     * @return 日期的字符串格式输出
     */
    public static String formatPreviousMonth(long timestamps, String pattern) {
        Date previousMonth = previousMonthFirstDay(timestamps);
        return format(hasText(pattern) ? pattern : MONTH_ZH, previousMonth);
    }

    /**
     * 格式化给定时间的月份
     *
     * @param timestamps 指定时间戳
     * @return 日期的字符串格式输出
     */
    public static String formatMonth(Long timestamps, String pattern) {
        return format(hasText(pattern) ? pattern : MONTH_ZH, new Date(timestamps));
    }

    /**
     * 获取当前月份第一天
     *
     * @param pattern 指定格式
     * @return 日期的字符串格式输出
     */
    public static String formatCurrentMonthFirstDay(String pattern) {
        LocalDate today = LocalDate.now();
        //本月的第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth(), 1);
        return format(pattern, firstDay);
    }

    /**
     * 获取前一个月最后一天
     *
     * @param pattern 指定格式
     * @return 日期的字符串格式输出
     */
    public static String formatPreviousMonthFirstDay(String pattern) {
        LocalDate today = LocalDate.now();
        //本月的第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth().plus(-1), 1);
        return format(pattern, firstDay);
    }

    /**
     * 获取前一个月第一天
     *
     * @param pattern 指定格式
     * @return 日期的字符串格式输出
     */
    public static String formatPreviousMonthLastDay(String pattern) {
        LocalDate today = LocalDate.now();
        //本月的第一天
        LocalDate firstDay = LocalDate.of(today.getYear(), today.getMonth().plus(-1), 1);
        LocalDate last = firstDay.with(TemporalAdjusters.lastDayOfMonth());
        return format(pattern, last);
    }

    /**
     * 格式化
     *
     * @param pattern 指定样式
     * @param date    时间
     * @return
     */
    public static String format(String pattern, LocalDate date) {
        if (Objects.isNull(pattern) || pattern.length() == 0) {
            return date.format(DateTimeFormatter.ofPattern(YEAR_MONTH_DAY_ZH, Locale.CHINA));
        }
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化
     *
     * @param pattern 指定样式
     * @param date    时间
     * @return
     */
    public static String format(String pattern, LocalDateTime date) {
        if (Objects.isNull(pattern) || pattern.length() == 0) {
            return date.format(DateTimeFormatter.ofPattern(YEAR_MONTH_DAY_HH_MM_M, Locale.CHINA));
        }
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化
     *
     * @param pattern 指定样式
     * @param date    时间
     * @return
     */
    public static String format(String pattern, Date date) {
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

        return format(pattern, localDateTime);
    }

    /**
     * 格式化
     *
     * @param pattern   指定样式
     * @param timestamp 时间戳
     * @return
     */
    public static String format(String pattern, Long timestamp) {
        return format(pattern, new Date(timestamp));
    }

    /**
     * 计算两个时间的差值
     *
     * @param start 开始时间
     * @param end   结束时间
     * @param unit  单位
     * @return
     */
    public static long until(Date start, Date end, TemporalUnit unit) {
        LocalDateTime startDateTime = start.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime endDateTime = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        return startDateTime.until(endDateTime, unit);
    }

    /**
     * 计算两个时间的差值
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param unit      单位
     * @return
     */
    public static long until(Long startTime, Long endTime, TemporalUnit unit) {
        return until(new Date(startTime), new Date(endTime), unit);
    }


    /**
     * 获取当前月份最后一天
     *
     * @param pattern 指定格式
     * @return 日期的字符串格式输出
     */
    public static String formatCurrentMonthLastDay(String pattern) {
        LocalDate today = LocalDate.now();
        //本月的最后一天
        LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth());
        return format(pattern, lastDay);
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值