在項目中經常會用到日期操作,比如日期格式化,返回當前日期,日期比較等。
1.返回當前時間
1.方式1 public static String dateFormat(Date date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(date); } 2.方式2 private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); public static String getCurrentDate(){ LocalDate localDate = LocalDate.now(); return localDate.format(dateFormatter); }
方式1因為 SimpleDateFormat不是線程安全的,因此做成局部變量,每次格式化都new一個對象,使用完GC回收,這是比較影響性能,推薦方式2,使用 DateTimeFormatter,是線程安全的格式化工具。內部使用 DateTimePrintContext 打印到 StringBuilder
2. 日期比較
方式1 /** 耗時 177ms * date日期和當前日期比較 * @param date 如果date 比當前日期大 返回true * @return */ public static boolean dateCompare(String date){ LocalDate current = LocalDate.now(); LocalDate comDate = LocalDate.parse(date , dateFormatter); return comDate.isAfter(current); } 方式2 //耗時 288ms public static boolean simpleDateCompare(String date) throws ParseException { return new SimpleDateFormat("yyyyMMDD").parse(date).after(new Date()); } 方式3 /** * 耗時 151ms * @param date * @return * @throws ParseException */ public static boolean dateStringCompare(String date) throws ParseException { return date.compareTo(getCurrentDate()) > 0; } public static void main(String[] args) { try { long start = System.currentTimeMillis(); int i = 0; while (i < 10000){ System.out.println(dateCompare("20200503")); i++; } System.out.println("time :"+ (System.currentTimeMillis() - start)); } catch (Exception e) { e.printStackTrace(); } }
三種比較方式,同樣的樣本數據執行1萬次,方式3直接字符串比較的性能最優,151ms,方式1其次,177ms,方式2最差,288ms,推薦方式2,方式3如果日期不是規則的,比如2019-01-01和2019-1-1這種,比較結果就會和預期不符。