1. 程式人生 > >java.text.Format及相關類詳解

java.text.Format及相關類詳解

Format

Format是一個用於格式化語言環境敏感的資訊(如日期、訊息和數字)的抽象基類,直接已知子類有DateFormat, MessageFormat, NumberFormat。
Format定義了程式設計介面,用於將語言環境敏感的物件格式化為String(使用format方法)和將String重新解析為物件(使用 parseObject方法)。 
通常,一個Format的parseObject方法必須能解析任何由其Format方法格式化的字串。不過,也可能存在不能解析的異常情況。例如,Format方法可能建立中間無分隔符的兩個相鄰整數,在這種情況下,parseObject無法判斷哪個數字屬於哪個數。
Java平臺為格式化日期、訊息和數字分別提供了三個特殊的Format的子類:DateFormat、MessageFormat和NumberFormat。具體的子類必須實現三個方法: 
format(Object obj, StringBuffer toAppendTo, FieldPosition pos) 
formatToCharacterIterator(Object obj) 
parseObject(String source, ParsePosition pos) 
這些常規方法允許對物件進行多型解析和格式化,還可以被使用(如被 MessageFormat 使用)。子類通常也為特定的輸入型別提供了另外的format方法,也為特定的結果型別提供了parse方法。當在輸入文字的開始沒有任何所需格式的文字時,則任何不帶 ParsePosition引數的parse方法都應該丟擲ParseException。 
大多數子類還將實現以下工廠方法: 
getInstance 獲取一個適合於當前語言環境的有用的格式物件 
getInstance(Locale) 獲取一個適合於指定語言環境的有用的格式物件。 
此外,某些子類還可能為了更特殊的控制實現其它getXxxxInstance方法。例如,NumberFormat類提供了getPercentInstance和 getCurrencyInstance方法來獲取特殊的數字格式器。
Format的子類如果允許程式設計師能為不同語言環境(比如用getInstance(Locale) )建立物件,必須實現以下類方法: 
public static Locale[] getAvailableLocales()
最後子類定義一個常量集合來標識格式輸出中的不同欄位。這些常量用於建立一個FieldPosition物件該物件標識欄位中所包含的資訊及其在格式化結果中的位置。這些常量應當命名為item_FIELD,其中item標識了該欄位。有關這些常量的例子,請參閱 ERA_FIELD及其在DateFormat中的同類。
格式通常不是同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,其它必須保持外部同步。

FieldPosition

public FieldPosition(int field)
為給定欄位建立一個FieldPosition物件。欄位由常量標識,在不同的Format子類中,常量名稱一般以_FIELD結尾。


public FieldPosition(Format.Field attribute)
為給定的欄位常量建立一個FieldPosition物件。欄位由不同Format子類中定義的常量來標識。這等效於呼叫new FieldPosition(attribute, -1)。


public FieldPosition(Format.Field attribute,int fieldID)
為給定的欄位建立一個FieldPosition物件。欄位由來自Field的子類之一的屬性常量以及一個由Format的子類定義的整型欄位ID標識。
當attribute不為null時,需要使用Field的Format子類應當優先考慮attribute而忽略fieldID。
不過,舊的Format子類可能不知道Field而依靠fieldID。如果該欄位沒有相應的整型常量,則fieldID應為-1。

FieldPosition是Format及其子類用於在格式輸出中(format(Object obj, StringBuffer toAppendTo, FieldPosition pos))標識欄位的簡單類。FieldPosition保持對格式輸出中欄位位置的兩個索引進行跟蹤:欄位的第一個字元的索引和緊跟欄位的最後一個字元的索引。 不同的Format類中的format方法需要一個FieldPosition物件作為引數。使用此format方法執行部分格式化或者以獲取格式化輸出的資訊(比如欄位位置)。欄位可以通過兩種方式標識,如下。兩者的作用是一致的,只是Format.Field常量更詳細,建議使用這種方式。  
1、通過一個其名稱通常以_FIELD結尾的整型常量。這些常量在Format的不同子類中定義: 
NumberFormat
static int FRACTION_FIELD 
          用於構造FieldPosition物件的欄位常量。 
static int INTEGER_FIELD 
          用於構造FieldPosition物件的欄位常量。
例子:
public static void main(String[] args) {
        NumberFormat numberFormat = NumberFormat.getInstance();
        StringBuffer stringBuffer1 = new StringBuffer();
        FieldPosition fieldPosition = new FieldPosition(NumberFormat.INTEGER_FIELD);
        BigDecimal bigDecimal = new BigDecimal("1.23456789");
        stringBuffer1 = numberFormat.format(bigDecimal, stringBuffer1, fieldPosition);
        System.out.println("stringBuffer1 = " + stringBuffer1);
        System.out.println("INTEGER:beginIndex=" + fieldPosition.getBeginIndex() + ",endIndex=" + fieldPosition.getEndIndex());

        fieldPosition = new FieldPosition(NumberFormat.FRACTION_FIELD);
        StringBuffer stringBuffer2 = new StringBuffer();
        stringBuffer2 = numberFormat.format(bigDecimal, stringBuffer2, fieldPosition);
        System.out.println("stringBuffer2 = " + stringBuffer2);
        System.out.println("FRACTION:beginIndex=" + fieldPosition.getBeginIndex() + ",endIndex=" + fieldPosition.getEndIndex());
    }
stringBuffer1 = 1.235
INTEGER:beginIndex=0,endIndex=1
stringBuffer2 = 1.235
FRACTION:beginIndex=2,endIndex=5

2、通過一個Format.Field常量:
NumberFormat.Field
static NumberFormat.Field CURRENCY 
          標識貨幣欄位的常量。 
static NumberFormat.Field DECIMAL_SEPARATOR 
          標識小數點欄位的常量。 
static NumberFormat.Field EXPONENT 
          標識指數字段的常量。 
static NumberFormat.Field EXPONENT_SIGN 
          標識指數符號 (exponent sign) 欄位的常量。 
static NumberFormat.Field EXPONENT_SYMBOL 
          標識指數符號 (exponent symbol) 欄位的常量。 
static NumberFormat.Field FRACTION 
          標識小數字段的常量。 
static NumberFormat.Field GROUPING_SEPARATOR 
          標識組分隔符欄位的常量。 
static NumberFormat.Field INTEGER 
          標識整數字段的常量。 
static NumberFormat.Field PERCENT 
          標識百分數字段的常量。 
static NumberFormat.Field PERMILLE 
          標識千分數字段的常量。 
static NumberFormat.Field SIGN 
          識別符號號欄位的常量。
例子:
public static void main(String[] args) {
        NumberFormat numberFormat = NumberFormat.getInstance();
        StringBuffer stringBuffer1 = new StringBuffer();
        FieldPosition fieldPosition = new FieldPosition(NumberFormat.Field.INTEGER);
        BigDecimal bigDecimal = new BigDecimal("1.23456789");
        stringBuffer1 = numberFormat.format(bigDecimal, stringBuffer1, fieldPosition);
        System.out.println("stringBuffer1 = " + stringBuffer1);
        System.out.println("INTEGER:beginIndex=" + fieldPosition.getBeginIndex() + ",endIndex=" + fieldPosition.getEndIndex());

        fieldPosition = new FieldPosition(NumberFormat.Field.FRACTION);
        StringBuffer stringBuffer2 = new StringBuffer();
        stringBuffer2 = numberFormat.format(bigDecimal, stringBuffer2, fieldPosition);
        System.out.println("stringBuffer2 = " + stringBuffer2);
        System.out.println("FRACTION:beginIndex=" + fieldPosition.getBeginIndex() + ",endIndex=" + fieldPosition.getEndIndex());
    }
stringBuffer1 = 1.235
INTEGER:beginIndex=0,endIndex=1
stringBuffer2 = 1.235
FRACTION:beginIndex=2,endIndex=5
public static void main(String[] args) {
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
        StringBuffer stringBuffer = new StringBuffer();
        FieldPosition pos = new FieldPosition(DateFormat.Field.DAY_OF_MONTH);
        stringBuffer = dateFormat.format(new Date(), stringBuffer, pos);
        System.out.println("stringBuffer = " + stringBuffer);
        System.out.println("DATE_FIELD:beginIndex= " + pos.getBeginIndex() + ",endIndex=" + pos.getEndIndex());
    }
stringBuffer = 2016年6月28日 上午11時07分18秒
DATE_FIELD:beginIndex= 7,endIndex=9

ParsePosition

ParsePosition是Format及其子類所使用的簡單類,用來在解析過程中跟蹤當前位置。各種Format類中的parseObject方法要求將 ParsePosition物件作為一個變數。解析具有不同格式的字串時,可以使用同一個ParsePosition,因為索引引數記錄的是當前位置。ParsePosition也會記錄解析錯誤的位置。
public ParsePosition(int index)
建立一個具有給定初始索引的新 ParsePosition。
例子:
public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String strings[] = {"xxx 2016-06-28 xxx1", "20160628 xxx2"};
        for (int i = 0; i < strings.length; i++) {
            ParsePosition parsePosition = new ParsePosition(4);//從第四位開始處理
            Date date = simpleDateFormat.parse(strings[i], parsePosition);
            //解析錯誤,返回null
            if (date == null) {
                System.out.println("無效日期:" + strings[i]);
                System.out.println("解析出錯的索引=" + parsePosition.getErrorIndex());
                System.out.println("當前索引=" + parsePosition.getIndex());
                continue;
            }
            String substring = strings[i].substring(parsePosition.getIndex());
            System.out.println("日期=" + date + ",剩餘部分:" + substring);
        }
    }
日期=Tue Jun 28 00:00:00 CST 2016,剩餘部分: xxx1
無效日期:20160628 xxx2
解析出錯的索引=8
當前索引=4

NumberFormat

NumberFormat是所有數值格式的抽象基類,提供格式化和解析數值的介面。NumberFormat 還提供了一些方法來確定哪些語言環境具有數值格式以及它們的名稱是什麼。 
NumberFormat 可用於格式化和解析任何語言環境的數值。使程式碼能夠完全獨立於小數點、千位分隔符甚至所用特定小數位數的語言環境約定,並與數值格式是否為偶小數無關。數值格式化通常是不同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,則它必須是外部同步的。
NumberFormat總共有三種例項,常規數值、貨幣數值,百分比數值,每種都可以用預設語言環境和指定語言環境。
常規數值:getInstance()(同getNumberInstance())、getInstance(Locale inLocale)(同getNumberInstance(Locale inLocale))
貨幣數值:getCurrencyInstance()、getCurrencyInstance(Locale inLocale)
百分比數值:getPercentInstance()、getPercentInstance(Locale inLocale)

public static Locale[] getAvailableLocales()
返回一個當前所支援的語言環境陣列

void setCurrency(Currency currency) 
設定格式化貨幣值時此數值格式使用的貨幣。

void setGroupingUsed(boolean newValue) 
設定此格式中是否使用分組,即是否有千位分隔符(逗號)。

void setMaximumFractionDigits(int newValue) 
設定數的小數部分所允許的最大位數。與解析無關。

void setMaximumIntegerDigits(int newValue) 
設定數的整數部分所允許的最大位數。與解析無關。

void setMinimumFractionDigits(int newValue) 
設定數的小數部分所允許的最小位數。與解析無關。

void setMinimumIntegerDigits(int newValue) 
設定數的整數部分所允許的最小位數。與解析無關。

void setParseIntegerOnly(boolean value) 
設定數是否應該僅作為整數進行解析。與格式化無關。

例子:
public static void main(String[] args) throws Exception {
        //常規數值
        NumberFormat format1 = NumberFormat.getNumberInstance();
        System.out.println(format1.getMaximumIntegerDigits());//2147483647
        System.out.println(format1.getMinimumIntegerDigits());//1
        System.out.println(format1.getMaximumFractionDigits());//3
        System.out.println(format1.getMinimumFractionDigits());//0
        System.out.println(format1.isGroupingUsed());//true
        System.out.println(format1.isParseIntegerOnly());//false

        System.out.println(format1.format(10000000));//10,000,000 預設分組
        System.out.println(format1.format(10000000.000));//10,000,000 小數點後全身0,被捨棄
        System.out.println(format1.format(10000000.001));//10,000,000.001
        System.out.println(format1.format(10000000.0001));//10,000,000 預設最大小數位數是3位

        System.out.println(format1.parse("10000000.001"));//1.0000000001E7 預設可以解析小數
        format1.setParseIntegerOnly(true);
        System.out.println(format1.parse("10000000.001"));//10000000

        //百分比數值
        NumberFormat format2 = NumberFormat.getPercentInstance();
        System.out.println(format2.getMaximumIntegerDigits());//2147483647
        System.out.println(format2.getMinimumIntegerDigits());//1
        System.out.println(format2.getMaximumFractionDigits());//0
        System.out.println(format2.getMinimumFractionDigits());//0
        System.out.println(format2.isGroupingUsed());//true
        System.out.println(format2.isParseIntegerOnly());//false

        System.out.println(format2.format(1.01));//101%
        System.out.println(format2.format(1.001));//100% 預設最大小數位數是0
        format2.setMaximumFractionDigits(1);
        System.out.println(format2.format(1.001));//100.1%

        System.out.println(format2.parse("100.1%"));// 1.001 預設可以解析小數

        //貨幣格式
        NumberFormat format3 = NumberFormat.getCurrencyInstance();
        System.out.println(format3.getMaximumIntegerDigits());//2147483647
        System.out.println(format3.getMinimumIntegerDigits());//1
        System.out.println(format3.getMaximumFractionDigits());//2
        System.out.println(format3.getMinimumFractionDigits());//2
        System.out.println(format3.isGroupingUsed());//true
        System.out.println(format3.isParseIntegerOnly());//false

        System.out.println(format3.format(10000));//¥10,000.00 預設語言環境是zh_CN

        System.out.println(format3.parse("¥10,000.00"));//10000
    }

DecimalFormat

DecimalFormat是NumberFormat的一個具體子類,用於格式化十進位制數字。該類設計有各種功能,使其能夠解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支援。通常不直接呼叫DecimalFormat的構造方法,要獲取具體語言環境的DecimalFormat(包括預設語言環境),可呼叫NumberFormat的某個工廠方法,如getInstance()。如果看原始碼會發現getInstance()其實返回的就是DecimalFormat例項。
DecimalFormat包含一個模式和一組符號。可直接使用applyPattern()或間接使用API方法來設定模式。符號儲存在DecimalFormatSymbols象中。如果想要改變符號,比如小數點,可以使用和DecimalFormate關聯的DecimalFormatSymbols,此類表示了DecimalFormat格式化數字所需的符號集(如小數點、組分隔符等等)。DecimalFormat 根據其語言環境資料為其自身建立一個DecimalFormatSymbols例項。如果需要更改這些符號,可從DecimalFormat#getDecimalFormatSymbols()獲得DecimalFormatSymbols物件並修改它。通常程式設計師不需要修改DecimalFormatSymbols。
DecimalFormat 提供 RoundingMode 中定義的舍入模式進行格式化。預設情況下,它使用 RoundingMode.HALF_EVEN。
DecimalFormat 通常不是同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問某個格式,則必須保持外部同步。 

DecimalFormat() 
使用預設模式和預設語言環境的符號建立一個DecimalFormat。 
DecimalFormat(String pattern) 
使用給定的模式和預設語言環境的符號建立一個DecimalFormat。 
DecimalFormat(String pattern, DecimalFormatSymbols symbols) 
使用給定的模式和符號建立一個DecimalFormat。


特殊符號

0 數字。阿拉伯數字,如果當前位置不存在數字,則顯示為0
# 數字。阿拉伯數字,在不影響數值的情況下,當前位置如果為0或者不存在,則不顯示
. 數字。小數分隔符或貨幣小數分隔符
- 數字。減號
, 數字。分組分隔符
E 數字。分隔科學計數法中的尾數和指數。在字首或字尾中無需加引號
; 子模式邊界。分隔正數和負數子模式(暫時不瞭解正負子模式)
% 字首或字尾。乘以 100 並顯示為百分數
\u2030 字首或字尾。乘以 1000 並顯示為千分數
¤(\u00A4) 字首或字尾。貨幣記號,由貨幣符號替換。如果兩個同時出現,則用國際貨幣符號替換。如果出現在某個模式中,則使用貨幣小數分隔符,而不使用小數分隔符
' 字首或字尾。用於在字首或或字尾中為特殊字元加引號,例如 "'#'#" 將 123 格式化為 "#123"。要建立單引號本身,請連續使用兩個單引號:"# o''clock"

語法

1、字首和字尾:數字前後的符號,除\uFFFE、\uFFFF和特殊字元以外的所有Unicode字元。
2、小數分隔符和千位分隔符應該是不同的字元,否則將不可能進行解析。 3、如果使用具有多個分組字元的模式,則最後一個分隔符和整數結尾之間的間隔才是使用的分組大小。所以"#,##,###,####"=="######,####"== "##,####,####"。  4、整數部分,#號放在0的左邊
5、小數部分,#號放在0的右邊
6、數字構成:整數.小數指數,例如0.###E0,指數字符後面的數字位數字符數給出了最小的指數位數,沒有最大值。 例子1:
public static void main(String[] args) throws Exception {
        DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols();
        unusualSymbols.setDecimalSeparator('|');
        unusualSymbols.setGroupingSeparator('^');

        String strange = "#,##0.###";
        DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
        weirdFormatter.setGroupingSize(4);

        String bizarre = weirdFormatter.format(12345.678);
        System.out.println(bizarre);//1^2345|678
    }

例子2:
public static void customFormat(String pattern, double value) {
        DecimalFormat decimalFormat = new DecimalFormat(pattern);
        String output = decimalFormat.format(value);
        System.out.println("value=" + value);
        System.out.println("pattern=" + pattern);
        System.out.println("output=" + output);
        System.out.println("=======================");
    }

    static public void main(String[] args) {
        customFormat("0", 123456.789);
        customFormat("#", 123456.789);
        customFormat("0000000.0000", 123456.789);
        customFormat("#######.####", 123456.789);
        customFormat("#000000.000#", 123456.789);
        customFormat("#0000,00.000#", 123456.789);
        customFormat("#.#######E0", 123456.789);
        customFormat("%#", 123456.789);
        customFormat("\u2030#", 123456.789);
        customFormat("\u00A4#", 123456.789);
        customFormat("\u00A5#", 123456.789);
        customFormat("''#'#'", 123456.789);
    }
輸出:
value=123456.789
pattern=0
output=123457
=======================
value=123456.789
pattern=#
output=123457
=======================
value=123456.789
pattern=0000000.0000
output=0123456.7890
=======================
value=123456.789
pattern=#######.####
output=123456.789
=======================
value=123456.789
pattern=#000000.000#
output=123456.789
=======================
value=123456.789
pattern=#0000,00.000#
output=12,34,56.789
=======================
value=123456.789
pattern=#.#######E0
output=1.2345679E5
=======================
value=123456.789
pattern=%#
output=%12345679
=======================
value=123456.789
pattern=‰#
output=‰123456789
=======================
value=123456.789
pattern=¤#
output=¥123457
=======================
value=123456.789
pattern=¥#
output=¥123457
=======================
value=123456.789
pattern=''#'#'
output='123457#
=======================

DateFormat

DateFormat是日期/時間格式化子類的抽象類。日期/時間格式化子類(如 SimpleDateFormat)允許進行格式化(也就是日期 -> 文字)、解析(文字-> 日期)和標準化。將日期表示為Date物件,或者表示為從GMT(格林尼治標準時間)1970 年 1 月 1 日 00:00:00這一刻開始的毫秒數。 
使用getDateInstance來獲取該國家/地區的標準日期格式。使用getTimeInstance可獲取該國家/地區的時間格式。使用getDateTimeInstance可獲取日期和時間格式。可以將不同選項傳入這些工廠方法,以控制結果的長度(從SHORT到MEDIUM到LONG再到FULL)。確切的結果取決於語言環境,但是通常: 
SHORT完全為數字,如 12.13.52 或 3:30pm 
MEDIUM較長,如 Jan 12, 1952 
LONG更長,如 January 12, 1952 或 3:30:32pm 
FULL是完全指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。 
如果願意,還可以在格式上設定時區。如果想對格式化或解析施加更多的控制(或者給予使用者更多的控制),可以嘗試將從工廠方法所獲取的DateFormat 強制轉換為 SimpleDateFormat。這適用於大多數國家/地區;只是要記住將其放入一個try程式碼塊中,以防遇到特殊的格式。日期格式不是同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,則它必須保持外部同步。 


例子:

public static void main(String[] args) throws Exception {
        Date date = new Date();
        DateFormat dateFormat1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
        DateFormat dateFormat2 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
        DateFormat dateFormat3 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA);
        System.out.println(dateFormat1.format(date));
        System.out.println(dateFormat2.format(date));
        System.out.println(dateFormat3.format(date));

        DateFormat dateFormat4 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
        DateFormat dateFormat5 = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
        DateFormat dateFormat6 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.CHINA);
        System.out.println(dateFormat4.format(date));
        System.out.println(dateFormat5.format(date));
        System.out.println(dateFormat6.format(date));

        System.out.println(dateFormat6.parse("2016年7月5日 下午05時29分54秒"));
    }
16-7-5
下午5:30
16-7-5 下午5:30
2016-7-5
17:30:22
2016年7月5日 下午05時30分22秒
Tue Jul 05 17:29:54 CST 2016

SimpleDateFormat

SimpleDateFormat是DateFormat的子類,它允許進行格式化(日期 -> 文字)、解析(文字 -> 日期)和規範化。 日期格式是不同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,則它必須是外部同步的。 
日期和時間格式由日期和時間模式字串指定。在日期和時間模式字串中,未加引號的字母'A'到'Z'和'a'到'z'被解釋為模式字母,用來表示日期或時間字串元素。文字可以使用單引號'引起來,以免進行解釋。"''"表示單引號。所有其他字元均不解釋;只是在格式化時將它們簡單複製到輸出字串,或者在解析時與輸入字串進行匹配所有其他字元'A'到'Z'和'a' 到'z'都被保留。 
字母 日期或時間元素 表示 示例
G Era 標誌符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的週數 Number 27
W 月份中的週數 Number 2
D 年中的天數 Number 189
d 月份中的天數 Number 10
F 月份中的星期 Number 2
E 星期中的天數 Text Tuesday; Tue
a Am/pm 標記 Text PM
H 一天中的小時數(0-23) Number 0
k 一天中的小時數(1-24) 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 時區 General time zone Pacific Standard Time; PST; GMT-08:00
Z 時區 RFC 822 time zone -0800

DateFormatSymbols是一個公共類,用於封裝可本地化的日期-時間格式化資料,如月名、星期幾的名稱和時區資料。DateFormat和 SimpleDateFormat都使用DateFormatSymbols封裝此資訊。

例子:

public static void main(String[] args) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("", Locale.US);
        System.out.println(Arrays.toString(simpleDateFormat.getDateFormatSymbols().getEras()));//[BC, AD]
        System.out.println(Arrays.toString(simpleDateFormat.getDateFormatSymbols().getShortWeekdays()));//[, Sun, Mon, Tue, Wed, Thu, Fri, Sat]
        System.out.println(Arrays.toString(simpleDateFormat.getDateFormatSymbols().getAmPmStrings()));//[AM, PM]

        Date date = new Date();

        /**
         * Text型別
         * 對於格式化來說,如果模式字母的數量大於等於 4,則使用完全形式;否則,在可用的情況下使用短形式或縮寫形式。
         * 對於解析來說,兩種形式都是可接受的,與模式字母的數量無關。
         */
        simpleDateFormat.applyPattern("G E a");
        System.out.println(simpleDateFormat.format(date));//AD Wed AM
        simpleDateFormat.applyPattern("GGGG EEEE aaaa");
        System.out.println(simpleDateFormat.format(date));//AD Wednesday AM
        simpleDateFormat.applyPattern("E");
        System.out.println(simpleDateFormat.parse("Wed"));//Wed Jan 07 00:00:00 CST 1970
        System.out.println(simpleDateFormat.parse("Wednesday"));//Wed Jan 07 00:00:00 CST 1970

        /**
         * Number型別
         * 對於格式化來說,模式字母的數量是最小的數位,如果數位不夠,則用0填充以達到此數量。
         * 對於解析來說,模式字母的數量被忽略,除非必須分開兩個相鄰欄位
         */
        simpleDateFormat.applyPattern("wwww WWWW DDDD dddd FFFF HHHH kkkk KKKK hhhh mmmm ssss SSSS");
        System.out.println(simpleDateFormat.format(date));//0028 0002 0188 0006 0001 0009 0009 0009 0009 0042 0023 0505
        System.out.println(simpleDateFormat.parse("1 1 1 1 1 1 1 1 1 1 1 1"));//Thu Jan 01 01:01:01 CST 1970

        /**
         * Year型別
         * 對於格式化來說,如果模式字母的數量為2,則年份擷取為2位數,否則將年份解釋為number。
         */
        simpleDateFormat.applyPattern("yy");
        System.out.println(simpleDateFormat.format(date));//16
        simpleDateFormat.applyPattern("y");
        System.out.println(simpleDateFormat.format(date));//2016
        System.out.println(simpleDateFormat.parse("20"));//Wed Jan 01 00:00:00 CST 2020

        /**
         * Month型別
         * 如果模式字母的數量為3或大於3,則將月份解釋為Text;否則解釋為Number。
         */
        simpleDateFormat.applyPattern("M");
        System.out.println(simpleDateFormat.format(date));//7
        simpleDateFormat.applyPattern("MM");
        System.out.println(simpleDateFormat.format(date));//07
        simpleDateFormat.applyPattern("MMM");
        System.out.println(simpleDateFormat.format(date));//Jul
        simpleDateFormat.applyPattern("MMMM");
        System.out.println(simpleDateFormat.format(date));//July
        simpleDateFormat.applyPattern("MMMMM");
        System.out.println(simpleDateFormat.format(date));//July

        /**
         * General time zone
         * 如果時區有名稱,則將它們解釋為Text。
         */
        simpleDateFormat.applyPattern("z");
        System.out.println(simpleDateFormat.format(date));//CST
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+0010"));
        System.out.println(simpleDateFormat.format(date));//GMT+00:10

        /**
         * RFC 822 time zone
         */
        simpleDateFormat.applyPattern("Z");
        simpleDateFormat.setTimeZone(TimeZone.getDefault());
        System.out.println(simpleDateFormat.format(date));//+0800
    }