SimpleDateFormat类所在java包位置:java.text.SimpleDateFormat。继承结构如下:
且实现了Serializable, Cloneable接口。
SimpleDateFormat类简介
SimpleDataFormat类可用于格式化、解析带区域的日期,可将日期格式转为文本,可将文本解析为日期,还可以进行日期规范化。
SimpleDataFormat类支持用户自定义日期格式,同时也提供一些内置的日期格式,例如可通过getTimeInstance、getDateInstance或DateFormat中的getDateTimeInstance获取内置日期格式。上述方法都会返回一个用默认格式的Date/Time类型对象。更多使用方法参考DateFomat类。
日期和时间的格式
日期和时间的格式可以通过String类型的格式指定,格式字母解释如下表所示:
字母 | 日期 | 表示类型 | 例子 |
G | 表示纪元时代 | Text | AD或BC |
y | 年 | Year | 1996; 96 |
Y | 周年 | Year | 2009; 09 |
M | 一年中的月(上下文相关) | Month | July; Jul; 07 |
L | 一年中的月(独立形式) | Month | July; Jul; 07 |
w | 一年中的第几周 | Number | 27 |
W | 月中的第几周 | Number | 2 |
D | 一年中的第几天 | Number | 189 |
d | 一月中的第几天 | Number | 10 |
F | 月份中的第几天 | Number | 2 |
E | 月份中的周几 | Text | Tuesday; Tue |
u | 一周中的第几天(1=周一,...,7=周日) | Number | 1 |
a | Am/pm 标记 | Text | PM |
H | 一天的几时 (0-23)--表示法1 | Number | 0 |
k | 一天的几时 (1-24)--表示法2 | Number | 24 |
K | am/pm 中的几时(0-11) | Number | 0 |
h | am/pm 中的几时(1-12) | Number | 12 |
m | 小时中的分钟 | Number | 30 |
s | 分钟下的秒 | Number | 55 |
S | 毫秒 | Number | 978 |
z | 时区(指定时区,例如:PST、GMT-08:00) | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区(RFC 822日期格式) | RFC 822 time zone | -0800 |
X | 时区(ISO 8601标准日期格式) | ISO 8601 time zone | -08; -0800; -08:00 |
注:
纪元AD、BC:BC(Before Christ)表示公元前(耶稣诞生之前),AD(Anno Domini)表示公元年。
太平洋标准时间(PST):比世界标准时间(UTC)晚8小时,比北京时间(UT+8:00)晚16小时。加拿大、墨西哥、美国在使用。GMT为格林尼治时区时间。
ISO 8601:全世界日期和时间相关的数据交换的国际标准。这个标准的目标是在全世界范围的通信中提供格式良好的、无歧义的时间和日期表示。
日期格式举例(地理位置为美国,时区为PST)
给定时间 2001-07-04 12:08:56,不同的日期时间格式解析的结果如下:
日期时间格式 | 结果 |
"yyyy.MM.dd G 'at' HH:mm:ss z" | 2001.07.04 AD at 12:08:56 PDT |
"EEE, MMM d, ''yy" | Wed, Jul 4, '01 |
"h:mm a" | 12:08 PM |
"hh 'o''clock' a, zzzz" | 12 o'clock PM, Pacific Daylight Time |
"K:mm a, z" | 0:08 PM, PDT |
"yyyyy.MMMMM.dd GGG hh:mm aaa" | 02001.July.04 AD 12:08 PM |
"EEE, d MMM yyyy HH:mm:ss Z" | Wed, 4 Jul 2001 12:08:56 -0700 |
"yyMMddHHmmssZ" | 010704120856-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" | 2001-07-04T12:08:56.235-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" | 2001-07-04T12:08:56.235-07:00 |
"YYYY-'W'ww-u" | 2001-W27-3 |
线程安全性
该类并未加入同步操作,因此非线程安全。推荐为每个线程单独创建一个SimpleDateFormat对象,如果多线程同步访问一个SimpleDateFormat共享对象时,必须额外做好同步操作。
推荐使用线程本地解决SimpleDateFormat非线程安全问题,示例:
privatestaticfinal ThreadLocal sdfThreadLocal = ThreadLocal.withInitial(()->{
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf;
});
publicstaticvoidmain(String[] args){
newThread(()->{
while (true){
try{
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+": "+sdfThreadLocal.get().format(newDate()));
}catch (InterruptedException e){
e.printStackTrace();
}
}
},"thread-1").start();
newThread(()->{
while (true){
try{
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+": "+sdfThreadLocal.get().format(newDate()));
}catch (InterruptedException e){
e.printStackTrace();
}
}
},"thread-2").start();
}
输出:
thread-2: 2022-05-19 20:50:23
thread-1: 2022-05-19 20:50:23
thread-1: 2022-05-19 20:50:24
thread-2: 2022-05-19 20:50:24
thread-1: 2022-05-19 20:50:25
thread-2: 2022-05-19 20:50:25
thread-1: 2022-05-19 20:50:26
方法介绍
(1)构造方法
public SimpleDateFormat()
使用默认日期格式,默认格式地理位置。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。
SimpleDateFormat(String pattern)
使用给定的patter日期格式,默认格式地理位置。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。
该方法等同于SimpleDateFormat(pattern, Locale.getDefault(Locale.Category.FORMAT)).
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
使用给定的pattern和日期符号。formatSymbols表示用于格式化的日期符号。
SimpleDateFormat(String pattern, Locale locale)
使用给定的日期格式,给定的默认地理位置格式。注意:该方法不支持所有的地理位置,可使用DateFormat的工厂方法替代。
最后三个构造方法存在的异常:
NullPointerException - 给定pattern为空
IllegalArgumentException - 给定pattern非法
(2)常用方法
该类继承自DateFormat类,拥有后者的全部共有方法。
返回类型 | 方法和简介 |
void | applyLocalizedPattern(String pattern)将给定的本地pattern格式应用到日期格式 |
void | applyPattern(String pattern)将给定的pattern格式应用到日期格式 |
Object | clone() |
boolean | equals(Object obj) |
StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition pos)将Date类型日期格式化为date/time类型,返回StringBuffer数据 |
AttributedCharacterIterator | formatToCharacterIterator(Object obj)格式化对象返回 AttributedCharacterIterator. |
Date | get2DigitYearStart()返回100年期间的开始日期,2位数的年份被解释为起始。 |
DateFormatSymbols | getDateFormatSymbols()获取格日期、时间格式化符号 |
int | hashCode() |
Date | parse(String text, ParsePosition pos)将text解析为Date类型数据 |
void | set2DigitYearStart(Date startDate)设置从用户指定的日期开始的100年期间2位数的年份 |
void | setDateFormatSymbols(DateFormatSymbols newFormatSymbols) 设置日期和时间的格式符号 |
String | toLocalizedPattern()返回描述日期格式的本地格式字符串 |
String | toPattern()返回描述此日期格式的格式字符串。 |
链接:https://juejin.cn/post/7099429949588635662