一、什么是SimpleDateFormat
SimpleDateFormat是Java中的一个时间格式化工具类,可以将Date对象转换为指定格式的字符串,也可以将符合格式的字符串转换为Date对象。
SimpleDateFormat类位于java.text包中,是线程不安全的。
二、SimpleDateFormat的常用格式符
SimpleDateFormat支持很多日期和时间格式符,下面列举一些常见的:
格式符 | 说明 |
---|---|
y | 年份表示:例如:2019 |
M | 月份表示:例如:11 |
d | 日表示:例如:01 |
H | 小时表示:例如:15 |
m | 分钟表示:例如:30 |
s | 秒表示:例如:59 |
S | 毫秒表示:例如:234 |
三、SimpleDateFormat的常用方法
1. 格式化日期
格式化日期使用SimpleDateFormat的format方法,该方法接收一个Date类型的参数,并返回一个String类型的结果。
import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { Date currentDate = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentDate); System.out.println(dateString); } }
2. 解析日期
解析日期使用SimpleDateFormat的parse方法,该方法接收一个符合指定格式的字符串,并返回一个Date类型的结果。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) throws ParseException { String dateString = "2019-11-01 15:30:59"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = formatter.parse(dateString); System.out.println(date); } }
四、SimpleDateFormat的线程安全问题
SimpleDateFormat是线程不安全的类,因为SimpleDateFormat对象中包含了一个Calendar对象,而Calendar对象是线程共享的对象,多个线程对同一个Calendar对象进行操作会导致线程安全问题。
为了避免SimpleDateFormat线程安全问题,可以使用ThreadLocal来解决,代码如下:
import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { private static final ThreadLocal<SimpleDateFormat> THREADLOCAL_FORMAT = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; public static String format(Date date) { return THREADLOCAL_FORMAT.get().format(date); } }
五、总结
SimpleDateFormat是Java中一个用于日期和时间格式化的工具类,可以将Date对象转换为指定格式的字符串,也可以将符合格式的字符串转换为Date对象。使用SimpleDateFormat时要注意它是线程不安全的,为了避免线程安全问题,可以使用ThreadLocal来限制SimpleDateFormat的共享范围。