这个表格里出现了一些“特殊”的匹配类型,做如下解释:
- Text:格式化(Date -> String),如果模式字母的数目是4个或更多,则使用完整形式;否则,如果可能的话,使用简短或缩写形式。对于解析(String -> Date),这两种形式都一样,与模式字母的数量无关
@Test
public void test9() throws ParseException {
String patternStr = “G GG GGGGG E EE EEEEE a aa aaaaa”;
Date currDate = new Date();
System.out.println(“↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓中文地区模式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓”);
System.out.println(“Date->String”);
DateFormat dateFormat = new SimpleDateFormat(patternStr, Locale.CHINA);
System.out.println(dateFormat.format(currDate));
System.out.println(“String->Date”);
String dateStrParam = “公元 公元 公元 星期六 星期六 星期六 下午 下午 下午”;
System.out.println(dateFormat.parse(dateStrParam));
System.out.println(“↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓英文地区模式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓”);
System.out.println(“Date->String”);
dateFormat = new SimpleDateFormat(patternStr, Locale.US);
System.out.println(dateFormat.format(currDate));
System.out.println(“String->Date”);
dateStrParam = “AD ad bC Sat SatUrday sunDay PM PM Am”;
System.out.println(dateFormat.parse(dateStrParam));
}
运行程序,输出:
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓中文地区模式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Date->String
公元 公元 公元 星期六 星期六 星期六 下午 下午 下午
String->Date
Sat Jan 03 12:00:00 CST 1970
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓英文地区模式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Date->String
AD AD AD Sat Sat Saturday PM PM PM
String->Date
Sun Jan 01 00:00:00 CST 1970
观察打印结果,除了符合模式规则外,还能在String -> Date解析时总结出两点结论:
- 英文单词,不分区大小写。如SatUrday sunDay都是没问题,但是不能有拼写错误
- 若有多个part表示一个意思,那么last win。如Sat SatUrday sunDay最后一个生效
对于Locale地域参数,因为中文不存在格式、缩写方面的特性,因此这些规则只对英文地域(如Locale.US生效)
- Number:格式化(Date -> String),模式字母的数量是数字的【最小】数量,较短的数字被零填充到这个数量。对于解析(String -> Date),模式字母的数量将被忽略,除非需要分隔两个相邻的字段
- Year:对于格式化和解析,如果模式字母的数量是4个或更多,则使用特定于日历的长格式。否则,使用日历特定的简短或缩写形式
- Month:如果模式字母的数量是3个或更多,则被解释为文本;否则,它将被解释为一个数字。
- 通用时区:如果该时区有名称,如Pacific Standard Time、PST、CST等那就用名称,否则就用GMT规则的字符串,如:GMT-08:00
- RFC 822时区:遵循RFC 822格式,向下兼容通用时区(名称部分除外)
- ISO 8601时区:对于格式化,如果与GMT的偏移值为0(也就是格林威治时间喽),则生成“Z”;如果模式字母的数量为1,则忽略小时的任何分数。例如,如果模式是“X”,时区是“GMT+05:30”,则生成“+05”。在进行解析时,“Z”被解析为UTC时区指示符。一般时区不被接受。如果模式字母的数量是4个或更多,在构造SimpleDateFormat或应用模式时抛出IllegalArgumentException。
- 这个规则理解起来还是比较费劲的,在开发中一般不太建议使用此种模式。若要使用请务必本地做好测试
SimpleD