一、SimpleDateFormat概述
SimpleDateFormat是Java提供的日期格式化類,它可以將日期格式化為指定的字符串,也可以將字符串解析為日期對象。
SimpleDateFormat類中提供了一些預定義的格式,如「yyyy-MM-dd HH:mm:ss」、「yyyy年MM月dd日」等,還可以自定義格式。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
System.out.println(format);
二、SimpleDateFormat代碼示例1:將日期格式化為「YYYYMMDD」格式
通過SimpleDateFormat類,我們可以很容易地實現將日期格式化為YYYYMMDD格式的字符串。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String format = sdf.format(new Date());
System.out.println(format);
上面的代碼中,定義了一個SimpleDateFormat對象,將其格式化字符串設置為「yyyyMMdd」,即YYYYMMDD格式,然後將當前日期格式化成此格式的字符串。
三、SimpleDateFormat代碼示例2:將字符串解析為日期對象
除了將日期格式化為指定字符串,SimpleDateFormat也可以將指定格式的字符串解析成日期對象。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = "2022-01-21";
Date date = sdf.parse(dateStr);
System.out.println(date);
上面的代碼中,定義了一個SimpleDateFormat對象,將其格式化字符串設置為「yyyy-MM-dd」,然後將日期字符串「2022-01-21」解析成日期對象。
四、SimpleDateFormat的線程安全
SimpleDateFormat是線程不安全的類,如果多個線程同時訪問一個SimpleDateFormat實例會引發線程安全問題,通常的做法是為每個線程創建一個SimpleDateFormat實例。
下面是線程不安全的代碼示例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i {
String format = sdf.format(new Date());
System.out.println(format);
});
}
executorService.shutdown();
上面的代碼中,定義了一個SimpleDateFormat實例,然後啟動10個線程並發調用此實例的format方法,會引發線程安全問題。
下面是線程安全的代碼示例:
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
System.out.println(format);
});
}
executorService.shutdown();
上面的代碼中,每個線程都創建了一個SimpleDateFormat對象,避免了線程安全問題。
五、SimpleDateFormat的性能優化
由於SimpleDateFormat是非常常用的日期格式化類,而且線程不安全,所以必須做好性能優化。
首先,可以使用ThreadLocal為每個線程創建一個SimpleDateFormat對象,避免多個線程競爭同一個SimpleDateFormat實例。
public final static ThreadLocal SDF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static String formatDate(Date date) {
SimpleDateFormat sdf = SFD.get();
return sdf.format(date);
}
其次,可以將日期格式化字符串預編譯,避免每次使用都需要解析格式化字符串,提高性能。
public class DateFormatUtil {
private static ConcurrentHashMap<String, SimpleDateFormat> sdfMap = new ConcurrentHashMap<>();
public static String formatDate(Date date, String pattern) {
SimpleDateFormat sdf = sdfMap.getOrDefault(pattern, new SimpleDateFormat(pattern));
sdfMap.putIfAbsent(pattern, sdf);
return sdf.format(date);
}
}
上面的代碼中,使用ConcurrentHashMap緩存已經創建的SimpleDateFormat對象,避免了重複創建。
六、小結
本文主要介紹了SimpleDateFormat類,包括如何將日期格式化為YYYYMMDD格式、如何將字符串解析為日期對象、如何避免線程安全問題以及如何進行性能優化等方面。
SimpleDateFormat是Java日期處理中非常常用的一個類,需要經常使用。在使用時,要注意線程安全問題和性能優化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/284791.html