一、什么是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的共享范围。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/189045.html
微信扫一扫 
支付宝扫一扫