博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

开始使用 java8 的日期工具类

Posted on 2020-11-25 22:09  海绵谷  阅读(242)  评论(0编辑  收藏  举报

例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题。而新的LocalDate、LocalDateTime、DateTimeFormatter是不可变值类。
LocalDate和LocalTime。它们是本地的,它们从观察者的角度表示日期和时间,例如书桌上的日历或墙上的时钟。还有一种称为复合类LocalDateTime,这是一个配对LocalDate和LocalTime。
下面是一个简单的思维导图和一个基于LocalDate、LocalDateTime...实现的日期工具类可以帮助我们记住一些类、API...,日期工具类中引入了gvava工具包。maven依赖如下

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
</dependency>
import com.google.common.base.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
​
import java.sql.Timestamp;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.*;
import java.util.*;
​
public class Date8Util {
    private static final Logger logger = LoggerFactory.getLogger(Date8Util.class);
    public static final HashMap<String,String> fomatMap = new HashMap();
    static {
        fomatMap.put("DATE_FORMAT_DEFAULT","yyyy-MM-dd HH:mm:ss");
        fomatMap.put("FORMATE1","yyyy-MM-dd hh:mm:ss");
        fomatMap.put("DATE_FORMAT_YYYYMMDD","yyyy-MM-dd");
        fomatMap.put("DATE_FORMAT_YYYYMMDDHHSSMS","yyyyMMddHHmmssms");
        fomatMap.put("DATE_FORMAT_YYYYMMDDHHSS","yyyyMMddHHmmss");
        fomatMap.put("DATE_FORMAT_YYYY_MM_DD","yyyyMMdd");
        fomatMap.put("DATE_FORMAT_YYYY_MM","yyyyMM");
        fomatMap.put("DATE_FORMAT_HHmmss","HHmmss");
        fomatMap.put("DATE_FORMAT_JQUERY_DATEPICKER_DEFAULT","yyyy/MM/dd");
        fomatMap.put("FORMATE_PATTERN_C_YYYYMMDD","yyyy年MM月dd日");
        fomatMap.put("FORMATE_PATTERN_C_MMDD","MM月dd日");
        fomatMap.put("FORMATE_PATTERN_C_YYYYMM","yyyy年MM月");
    }
    /**
     * 获取当前日期时间 yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String getTime(){
        LocalDateTime date = LocalDateTime.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_DEFAULT"), Locale.CHINA);
        return date.format(dtf);
    }
​
    /**
     * 当前日期 字符串日期格式
     * @return Date
     */
    public static Date getNowDate(){
        return Timestamp.valueOf(getTime());
    }
​
    /**
     * 当前日期.yyyy-MM-dd
     * @return
     */
    public static String getCurrentDate(){
        return LocalDate.now().format(DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_YYYYMMDD"), Locale.CHINA));
    }
​
    /**
     * @Description 当前日期时间 yyyyMMddHHmmssms
     * @return
     */
    public static String getCurrDate(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_YYYYMMDDHHSSMS"), Locale.CHINA));
    }
    public static String getNowDate(String fomat){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(fomat,Locale.CHINA));
    }
​
    /**
     * 字符串转日期
     * @param aMask
     * @param aDate
     * @return
     */
    public static String convertDateToString(String aMask, Date aDate){
        //Date 转化位 LocalDateTime
        LocalDateTime dateTime = LocalDateTime.ofInstant(aDate.toInstant(),ZoneId.systemDefault());
        return getDateTime(aMask, dateTime);
    }
    public static String convertDateToString(String aMask, LocalDateTime dateTime){
        return getDateTime(aMask, dateTime);
    }
​
    /**
     * 获取date time
     * @param fmt
     * @param dateTime
     * @return
     */
    private static String getDateTime(String fmt, LocalDateTime dateTime) {
        DateTimeFormatter dtf = null;
        String str = "";
        if(dateTime != null){
            dtf = DateTimeFormatter.ofPattern(fmt,Locale.CHINA);
            str = dateTime.format(dtf);
        }
        return str;
    }
​
    /**
     * 日期字符串转 日期
     * @param fmt
     * @param dateStr
     * @return
     */
    public static LocalDate convertStringToDate(String fmt,String dateStr){
        if (Strings.isNullOrEmpty(fmt) || Strings.isNullOrEmpty(dateStr)) {
            return null;
        } else {
            DateTimeFormatter sdf = DateTimeFormatter.ofPattern(fmt,Locale.CHINA);
            try {
                return LocalDate.parse(dateStr,sdf);
            } catch (DateTimeParseException var4) {
                logger.error("ParseException[" + fmt + "] for:" + dateStr, var4);
                return null;
            }
        }
    }
​
    /**
     * 获取 日期所在月份的第一天 date为空传当前月
     * @param date
     * @return
     */
    public static LocalDate getFirstDayOfMonth(LocalDate date){
        return Optional.ofNullable(date).map(dt -> dt.with(TemporalAdjusters.firstDayOfMonth())).orElse(null);
    }
    /**
     * 获取 日期所在月份的最后一天,date为空传当前月
     * @param date
     * @return
     */
    public static LocalDate getLastDayOfMonth(LocalDate date){
        return Optional.ofNullable(date).map(dt -> dt.with(TemporalAdjusters.lastDayOfMonth())).orElse(null);
    }
​
    /**
     * 获取上一个月的这个时候,例如当前日期2002-09-11,则返回2020-08-11
     * @param date
     * @return
     */
    public static LocalDate getMonthOfMonth(LocalDate date){
        return Optional.ofNullable(date).map(dt -> dt.minusMonths(1)).orElse(null);
    }
​
    /**
     * 获取系统日期时间
     * @return
     */
    public static LocalDateTime getSystemTime(){
        return LocalDateTime.ofInstant(Instant.now(),ZoneId.systemDefault());
    }
​
    /**
     * 日期时间 转字符串
     * @param dateTime
     * @param pattern
     * @return
     */
    public static String dateTimeToString(LocalDateTime dateTime, String pattern){
        if(dateTime == null || Strings.isNullOrEmpty(pattern)){
            return null;
        }
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern,Locale.CHINA);
        return dateTime.format(dtf);
    }
​
    /**
     * 两个日期相隔的天数
     * @param startdate
     * @param endDate
     * @return
     */
    public static int daysOfTwo(LocalDate startdate, LocalDate endDate){
        return (int) startdate.until(endDate, ChronoUnit.DAYS);
    }
    public static int daysOfTwo(String startdate, String endDate, String dateFormat){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat,Locale.CHINA);
        LocalDate smDate = LocalDate.parse(startdate,dtf);
        LocalDate bDate = LocalDate.parse(endDate,dtf);
        return  (int)smDate.until(bDate,ChronoUnit.DAYS);
    }
​
    /**
     * 昨天日期
     * @return
     */
    public static String getYesterday(){
        LocalDate now = LocalDate.now();
        return now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.CHINA));
    }
​
    /**
     * 比较日期大小
     * @param date1
     * @param date2
     * @return
     */
    public static int compare(String date1, String date2){
        DateTimeFormatter dtf = null;
        if(date1.indexOf(":") > -1 && date2.indexOf(":") > -1){
            dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",Locale.CHINA);
            LocalDateTime dateTime1 = LocalDateTime.parse(date1,dtf);
            LocalDateTime dateTime2 = LocalDateTime.parse(date2,dtf);
            if(dateTime1.isBefore(dateTime2)){
                return  -1;
            }
            return dateTime1.isAfter(dateTime2) ? 1:0;
        }else{
            dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.CHINA);
            LocalDate dt1 = LocalDate.parse(date1,dtf);
            LocalDate dt2 = LocalDate.parse(date2,dtf);
            if(dt1.isBefore(dt2)){
                return -1;
            }
            return dt1.isAfter(dt2) ? 1:0;
        }
    }
​
    /**
     * 获取日期 x年x月x日
     * @param date
     * @return
     */
    public static String getFormatDate(String date){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate localDate = LocalDate.parse(date,dtf2);
        return localDate.format(dtf);
    }
​
    /**
     * data1 是否 大于date2
     * @param date1
     * @param date2
     * @param format
     * @return
     */
    public static boolean date1DYdate2NY(String date1, String date2, String format){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
        LocalDate dt1 = LocalDate.parse(date1,dtf);
        LocalDate dt2 = LocalDate.parse(date2,dtf);
        return  dt1.isAfter(dt2);
    }
​
    public static String getTimeYYYYMMDD() {
        DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyyMMdd",Locale.CHINA);
        return LocalDate.now().format(sdf);
    }
​
    public static String getTimeHHmmss() {
        DateTimeFormatter sdf = DateTimeFormatter.ofPattern("HHmmss",Locale.CHINA);
        return LocalTime.now().format(sdf);
    }
​
    public static String getTimeHHmmss000() {
        DateTimeFormatter sdf = DateTimeFormatter.ofPattern("HHmmss000",Locale.CHINA);
        return LocalTime.now().format(sdf);
    }
    public static LocalDateTime changeMonth(LocalDateTime date, int i) {
        return date.minusMonths(i);
    }
​
    public static String changeMonth(int month, String format) {
        LocalDateTime dateTime = changeMonth(LocalDateTime.now(),month);
        return dateToString(getFirstDayOfMonth(dateTime.toLocalDate()), format);
    }
​
    private static String dateToString(LocalDate date, String format) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
        return  date.format(dtf);
    }
​
    /**
     * 获取上年第一天
     * @param format
     * @param year
     * @return
     */
    public static String getFirstDayOfPastYear(String format, int year) {
        LocalDateTime dateTime = LocalDateTime.now().minusYears(year);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
        String sdate = dateTime.with(TemporalAdjusters.firstDayOfYear()).format(dtf) ;
        return sdate;
    }
​
    public static String getFirstDayOfLastYear(String format) {
        return getFirstDayOfPastYear(format, 1);
    }
​
    /**
     * 获取上x年的的最后一天
     * @param format
     * @param year
     * @return
     */
    public static String getLastDayOfPastYear(String format, int year) {
        LocalDateTime dateTime = LocalDateTime.now().minusYears(year);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
        String sdate = dateTime.with(TemporalAdjusters.lastDayOfYear()).format(dtf) ;
        return sdate;
    }
​
    /**
     * 获取上1年的的最后一天
     * @param format
     * @return
     */
    public static String getLastDayOfLastYear(String format) {
        return getLastDayOfPastYear(format, 1);
    }
​
    /**
     * 当前月 + month 的第一天
     * @param month
     * @return
     */
    public static String getFirstDayOfMonth(int month) {
        LocalDate localDate = LocalDate.now().minusMonths(-month);
        LocalDate day = localDate.with(TemporalAdjusters.firstDayOfMonth());
        return dateToString(getFirstDayOfMonth(day), "yyyy-MM-dd");
    }
    /**
     * 当前年+year , 月 + month 的第一天
     * @param month
     * @return
     */
    public static String getFirstDayOfMonth(int month, int year) {
        LocalDate localDate = LocalDate.now().minusYears(-year).minusMonths(-month);
        LocalDate day = localDate.with(TemporalAdjusters.firstDayOfMonth());
        return dateToString(getFirstDayOfMonth(day), "yyyy-MM-dd");
    }
    public static boolean isMonthEnd(LocalDate date){
        LocalDate day = date.with(TemporalAdjusters.lastDayOfMonth());
        if(date.equals(day)){
            return  true;
        }
        return false;
    }
    public static boolean isFirstDayOfMonth(String date){
        LocalDate dt = convertStringToDate("yyyy-MM-dd",date);
        return Strings.isNullOrEmpty(date) ? false : dt.equals(dt.with(TemporalAdjusters.firstDayOfMonth()));
    }
    public static LocalDate getFirstDayOfWeek(LocalDate date){
        TemporalField fieldISO = WeekFields.ISO.dayOfWeek();
        return date.with(fieldISO,1);
    }
}