开始使用 java8 的日期工具类

例如,现有的类(例如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);    }}
(0)

相关推荐