2020年11月25日星期三

开始使用 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); }}









原文转载:http://www.shaoqun.com/a/493106.html

yiqu:https://www.ikjzd.com/w/210

三维度:https://www.ikjzd.com/w/1312

赛兔:https://www.ikjzd.com/w/2375


例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题。而新的LocalDate、LocalDateTime、DateTimeFormatter是不可变值类。LocalDate和LocalTime。它们是本地的,它们从观察者的角度表示日期和时间,例如书桌上的日历或墙上的时钟。还有一种称为复合类LocalDateTime,
万国邮政联盟:万国邮政联盟
斑马物联网:斑马物联网
七夕节送什么礼物好?:七夕节送什么礼物好?
7月27日国外天气预报 亚州南部北部有强降水:7月27日国外天气预报 亚州南部北部有强降水
桂林银子岩好玩吗?漂亮吗?:桂林银子岩好玩吗?漂亮吗?

没有评论:

发表评论