项目过程中,经常遇到需要字符串格式的日期和Date类型的日期之间的相互转换。使用SimpleDateFormat类,可以方便完成想要的转换。
SimpleDateFormat能够实现本地化的时间格式化及转换。从选定一个自定义的模式(pattren)开始,模式由已经定义好的 'A'
to 'Z'
及 'a'
to 'z'字母组成,也可以在模式中引入文本,但要使用’(单括号)括住。下图就是已经定义好的模式字母表:
Letter | Date or Time Component | Presentation | Examples |
---|---|---|---|
G |
Era designator | Text | AD |
y |
Year | Year | 1996 ; 96 |
Y |
Week year | Year | 2009 ; 09 |
M |
Month in year | Month | July ; Jul ; 07 |
w |
Week in year | Number | 27 |
W |
Week in month | Number | 2 |
D |
Day in year | Number | 189 |
d |
Day in month | Number | 10 |
F |
Day of week in month | Number | 2 |
E |
Day name in week | Text | Tuesday ; Tue |
u |
Day number of week (1 = Monday, ..., 7 = Sunday) | Number | 1 |
a |
Am/pm marker | Text | PM |
H |
Hour in day (0-23) | Number | 0 |
k |
Hour in day (1-24) | Number | 24 |
K |
Hour in am/pm (0-11) | Number | 0 |
h |
Hour in am/pm (1-12) | Number | 12 |
m |
Minute in hour | Number | 30 |
s |
Second in minute | Number | 55 |
S |
Millisecond | Number | 978 |
z |
Time zone | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z |
Time zone | RFC 822 time zone | -0800 |
X |
Time zone | ISO 8601 time zone | -08 ; -0800 ; -08:00 |
在一个模式中,模式字母可以重复,不同数量的字母代表不同的意思:
- text类型:格式化时,如果模式字母数量大于等于4,则使用完整格式表示(EEEE表示要将星期名字格式化为非缩写如Monday);转换时,结果不受字母数量的影响,都接受。
- number类型:格式化时,模式字母的重复次数就是格式化后最小位数,不够的用0填充(如"dddd"表示将日期格式化为4为数字,但日期最大为2为,所以导致高两位的数字被0填充,0011,表示11日);转换时:同格式化类似。
- Month类型:格式化时:如果模式字母重复次数大于或等于3,则被解释为text类型(July,Jul等),否则就解释为数字型。转换时:模式要和被转换的字符串对应,例如月份"12"对应的模式为"MM"或者"M",但是不能为"MMM",除非字符串为"OCT"或者"October";
下面看看几个应用:
Long now = System.currentTimeMillis(); SimpleDateFormat sdf2 = new SimpleDateFormat("MM ddddddddddd,yyyy EEEE"); System.out.println(sdf2.format(now));
输出:
07 00000000031,2014 星期四 //日数的格式化模式过长,高位用0填充,星期为中文表示,默认情况下,
Long now = System.currentTimeMillis();
SimpleDateFormat sdf2 = new SimpleDateFormat("MMMM dd,yyyy EEEE",Locale.US);
System.out.println(sdf2.format(now));
输出:
July 31,2014 Thursday //指定地区为US,则以US格式输出,MMMM表示月份为完整文本类型
转换:
String dateString = "2000,October 22 10:10:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MMMM dddd HH:mm:ss",Locale.ENGLISH);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
Sun Oct 22 10:10:11 CST 2000
String dateString = "2000,October 22 10:10:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM dddd HH:mm:ss",Locale.ENGLISH);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:不能转换,因为被转换的字符串的月份为完整文本类型,模式也要为"MMMM"
String dateString = "2000,10 22 10:10:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM dddd HH:mm:ss",Locale.ENGLISH);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
Sun Oct 22 10:10:11 CST 2000 //月份为数字,模式对应为少于3为的”MM“,
String dateString = "2000,10 22 10:10";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM dddd HH:mm:ss",Locale.ENGLISH);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:不能转换,因为被转换的字符串没有秒的数字,但模式包含了秒,无法确定秒为多少。
String dateString = "2000,10 22 10:10:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM dddd HH:mm",Locale.ENGLISH);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
Sun Oct 22 10:10:00 CST 2000 //模式没有指定秒,但是转换字符串有,但不影响转换,只是结果的秒为0;
String dateString = "2000,十月 22 10:10:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MMM dddd HH:mm",Locale.PRC);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
Sun Oct 22 10:10:00 CST 2000 //注意被转换的字符串包含了中国的月份表示,SimpleDateFormat实例也要指明地区为中国,否则转换失败
String dateString = "2000,十月 22 10:10:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm",Locale.PRC);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
不能转换,不转换的字符串日期格式和模式不匹配,而且月份模式字母重复次数要大于或等于3
String dateString = "2000/十月/22 10:10:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd HH:mm",Locale.PRC);
Date d = sdf.parse(dateString);
System.out.println(d.toString());
输出:
Sun Oct 22 10:10:00 CST 2000