SimpleDateFormat——日期格式化类
什么是SimpleDateFormat
SimpleDateFormat是Java中的日期格式化类,在日期和字符串之间进行转换的时候特别有用。SimpleDateFormat是线程不安全的,应该在每个线程中单独创建实例使用。
如何使用SimpleDateFormat
使用SimpleDateFormat很简单,通过构造函数创建实例,并传入想要格式化或解析的日期格式即可。
SimpleDateFormatsdf=newSimpleDateFormat(\"yyyy-MM-dd\"); Datedate=sdf.parse(\"2021-05-01\"); Stringstr=sdf.format(date);
如上面的例子所示,先通过SimpleDateFormat的静态常量或自定义日期格式创建实例,然后可以使用parse()方法将字符串转化为日期,也可以使用format()方法将日期格式化为字符串。
SimpleDateFormat还提供了一些可以用来格式化输出的选项。例如:
符号 | 描述 | 示例 | 输出 |
---|---|---|---|
y | 年份 | \"yy\"表示2位年份,\"yyyy\"表示4位年份 | 21,2021 |
M | 月份 | \"M\"表示数值月份,\"MM\"表示2位数月份,\"MMM\"表示缩写月份,\"MMMM\"表示全称月份 | 5,05,May,May |
d | 日期 | \"d\"表示数值日期,\"dd\"表示2位数日期 | 1,01 |
H | 小时 | \"H\"表示数值小时,\"HH\"表示2位数小时 | 8,08 |
m | 分钟 | \"m\"表示数值分钟,\"mm\"表示2位数分钟 | 0,00 |
s | 秒钟 | \"s\"表示数值秒钟,\"ss\"表示2位数秒钟 | 0,00 |
S | 毫秒 | \"S\"表示数值毫秒,\"SSS\"表示3位数毫秒 | 0,000 |
E | 星期 | \"E\"表示缩写星期,\"EEEE\"表示全称星期 | Sat,Saturday |
a | 上午/下午 | \"a\"表示上午或下午 | AM,PM |
z | 时区 | \"z\"表示缩写时区,\"zzzz\"表示全称时区 | GMT+8 |
SimpleDateFormat的线程安全问题
因为SimpleDateFormat是非线程安全的,如果在多个线程中同时使用同一个SimpleDateFormat实例,会导致数据混乱。解决这个问题的方法有两种:
- 使用ThreadLocal。每个线程中创建一个SimpleDateFormat实例,然后将它置于ThreadLocal中。这样,在每个线程中就都有了自己独立的DateFormat实例。
- 使用DateTimeFormatter。Java8之后,Java提供了新的格式化日期和时间的API——DateTimeFormatter。通过它我们无需担心线程安全问题,可以在各个线程中直接使用。
小结
SimpleDateFormat是Java中的日期格式化类,它可以将日期和字符串之间互相转换。虽然这个类非常方便,但非线程安全,不能在多个线程中共享。因此我们需要使用ThreadLocal或DateTimeFormatter保证线程安全。