使用jdk8 time API的日期工具类

这是日期工具类的第二篇,使用新API来做的。现阶段Java8的新日期API,收到的支持并不太多,mybatis不支持对LocalDate,LocalDateTime的直接读写,需要再引入一个库,使用新的typeHandler才行,数据库内,似乎对LocaDate存储也有问题,使用不当可能引起日期不对的情况,具体了解的不多,所以现阶段这个库的普及情况还有待考证。

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * 日期工具类
 * 针对入参是Date,long,string有三套函数
 * 使用jdk8的新时间API
 **/
public class DateUtil {

    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


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

    /**
     * 按传入的格式 返回格式化的当前日期
     *
     * @param pattern
     * @return
     */
    public static String currentDayStr(String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(LocalDateTime.now());
    }

    /**
     * 按传入的格式 返回格式化的传入日期
     *
     * @param pattern
     * @return
     */
    public static String currentDayStr(Date date, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(date.toInstant());
    }

    /**
     * 判断当前日期和传入日期是否是同一个月
     *
     * @param data
     * @return
     */
    public static boolean isCurrentMonth(Date data) {
        LocalDate nowDate = LocalDate.now();
        LocalDate otherDate = data.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return nowDate.getMonth().equals(otherDate.getMonth());
    }

    /**
     * 判断传入日期和当前日期是否是同一天
     *
     * @param data
     * @return
     */
    public static boolean isCurrentDay(Date data) {
        LocalDate nowDate = LocalDate.now();
        LocalDate otherDate = data.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return nowDate.getDayOfYear() == otherDate.getDayOfYear();
    }

    /**
     * 返回传入日期的下一天日期,时分秒和当前日期相同
     *
     * @param currentDate 当前日期
     * @return
     */
    public static LocalDateTime nextDay(Date currentDate) {
        Instant instant = currentDate.toInstant().plus(Period.ofDays(1));
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 返回传入日期的上一天日期,时分秒和当前日期相同
     *
     * @param currentDate 当前日期
     * @return
     */
    public static LocalDateTime previousDay(Date currentDate) {
        Instant instant = currentDate.toInstant().minus(Period.ofDays(1));
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 返回传入日期当月的第一天日期,时分秒和当前日期相同
     *
     * @param currentDate
     * @return
     */
    public static LocalDateTime firstDayOfMonth(Date currentDate) {
        return currentDate.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime()
                .with(TemporalAdjusters.firstDayOfMonth());
    }

    /**
     * 返回传入日期当月的最后一天日期,时分秒和当前日期相同
     *
     * @param currentDate
     * @return
     */
    public static LocalDateTime lastDayOfMonth(Date currentDate) {
        return currentDate.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime()
                .with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 返回传入日期的当天开始 时分秒都是0
     *
     * @param now
     * @return
     */
    public static LocalDateTime startOfDay(Date now) {
        return now.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime()
                .with(ChronoField.MILLI_OF_DAY, 0);
    }

    /**
     * 返回传入日期的当天结束 也是第二天的开始时间
     *
     * @param now
     * @return
     */
    public static LocalDateTime endOfDay(Date now) {
        return now.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime()
                .with(ChronoField.MILLI_OF_DAY, 0)
                .plus(1, ChronoUnit.DAYS);
    }


    /**
     * 判断当前日期和传入日期是否是同一个月
     *
     * @param data
     * @return
     */
    public static boolean isCurrentMonth(String data) {
        LocalDate nowDate = LocalDate.now();
        TemporalAccessor otherDate = DATE_FORMATTER.parse(data);
        if (!otherDate.isSupported(ChronoField.MONTH_OF_YEAR)) {
            return false;
        }
        return nowDate.getMonth().getValue() == (otherDate.get(ChronoField.MONTH_OF_YEAR));

    }

    /**
     * 判断传入日期和当前日期是否是同一天
     *
     * @param data
     * @return
     */
    public static boolean isCurrentDay(String data) {
        LocalDate nowDate = LocalDate.now();
        TemporalAccessor otherDate = DATE_FORMATTER.parse(data);
        if (!otherDate.isSupported(ChronoField.DAY_OF_YEAR)) {
            return false;
        }
        return nowDate.getDayOfYear() == (otherDate.get(ChronoField.DAY_OF_YEAR));

    }

    /**
     * 返回传入日期的下一天日期,时分秒和当前日期相同
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime nextDay(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.plus(Period.ofDays(1));
    }

    /**
     * 返回传入日期的上一天日期,时分秒和当前日期相同
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime previousDay(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.minus(Period.ofDays(1));
    }

    /**
     * 返回传入日期当月的第一天日期,时分秒和当前日期相同
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime firstDayOfMonth(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.with(TemporalAdjusters.firstDayOfMonth());
    }

    /**
     * 返回传入日期当月的最后一天日期,时分秒和当前日期相同
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime lastDayOfMonth(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 返回传入日期的当天开始 时分秒都是0
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime startOfDay(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.with(ChronoField.MILLI_OF_DAY, 0);
    }

    /**
     * 返回传入日期的当天结束 也是第二天的开始时间
     *
     * @param date         日期格式 yyyy-MM-dd 或者 yyyy-MM-dd HH:mm:ss
     * @param needTimePart 如果传入格式是 yyyy-MM-dd,则传入true,格式是yyyy-MM-dd HH:mm:ss 传入false
     * @return
     */
    public static LocalDateTime endOfDay(String date, boolean needTimePart) {
        if (needTimePart) {
            date = date.concat(TIME_SUBFIX);
        }
        LocalDateTime dateTime = LocalDateTime.parse(date, TIME_FORMATTER);
        return dateTime.with(ChronoField.MILLI_OF_DAY, 0)
                .plus(1, ChronoUnit.DAYS);
    }

    /**
     * 按传入的格式 返回格式化的传入日期
     *
     * @param pattern
     * @return
     */
    public static String currentDayStr(long timeStamp, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(new Date(timeStamp).toInstant());
    }

    /**
     * 判断当前日期和传入日期是否是同一个月
     *
     * @param timeStamp
     * @return
     */
    public static boolean isCurrentMonth(long timeStamp) {
        return isCurrentMonth(new Date(timeStamp));
    }

    /**
     * 判断传入日期和当前日期是否是同一天
     *
     * @param timeStamp
     * @return
     */
    public static boolean isCurrentDay(long timeStamp) {
        return isCurrentDay(new Date(timeStamp));
    }

    /**
     * 返回传入日期的下一天日期,时分秒和当前日期相同
     *
     * @param timeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime nextDay(long timeStamp) {
        return nextDay(new Date(timeStamp));
    }

    /**
     * 返回传入日期的上一天日期,时分秒和当前日期相同
     *
     * @param timeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime previousDay(long timeStamp) {
        return previousDay(new Date(timeStamp));
    }

    /**
     * 返回传入日期当月的第一天日期,时分秒和当前日期相同
     *
     * @param timeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime firstDayOfMonth(long timeStamp) {
        return firstDayOfMonth(new Date(timeStamp));
    }

    /**
     * 返回传入日期当月的最后一天日期,时分秒和当前日期相同
     *
     * @param timeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime lastDayOfMonth(long timeStamp) {
        return lastDayOfMonth(new Date(timeStamp));
    }

    /**
     * 返回传入日期的当天开始 时分秒都是0
     *
     * @param nowTimeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime startOfDay(long nowTimeStamp) {
        return startOfDay(new Date(nowTimeStamp));
    }

    /**
     * 返回传入日期的当天结束 也是第二天的开始时间
     *
     * @param nowTimeStamp 毫秒的时间戳
     * @return
     */
    public static LocalDateTime endOfDay(long nowTimeStamp) {
        return endOfDay(new Date(nowTimeStamp));
    }


    public static void main(String[] args) {
        System.out.println(TIME_FORMATTER.format(DateUtil.nextDay(new Date())));
        System.out.println(DateUtil.firstDayOfMonth(new Date()));
        System.out.println(DateUtil.lastDayOfMonth(new Date()));
        System.out.println(DateUtil.startOfDay(new Date()));
        System.out.println(DateUtil.endOfDay(new Date()));

        System.out.println(DATE_FORMATTER.format(DateUtil.endOfDay("2018-12-12 12:12:12", false)));
        System.out.println(TIME_FORMATTER.format(DateUtil.endOfDay(System.currentTimeMillis())));

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值