您的位置:

Java中SimpleDateFormat的使用

一、什么是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的共享范围。