java 日期格式化類SimpleDateFormat的使用:日期轉字元,字元轉日期
java 日期格式化類SimpleDateFormat的使用:日期轉字元,字元轉日期
部落格背景,本人是名java實習生,在實習階段遇到了遇到了業務需求非常奇葩的醫療軟體,其對時間格式的要求非常的奇葩,所以寫這篇部落格以總結和記錄 SimpleDateFormat類日期格式轉換的用法。
1. java.text.SimpleDateFormat類
- SimpleDateFormat是一個不與語言環境有關的方式來格式化和解析日期的具體類。
- 它允許進行格式化(日期文字)、解析(文字日期)
==格式化:==文字 使用SimpleDateFormat的format()方法
- SimpleDateFormat() :預設的模式和語言環境建立物件
- public SimpleDateFormat(String pattern):該構造方法可以用引數pattern指定的格式建立一個物件,該物件呼叫:
- public String format(Date date):方法格式化時間物件date
==解析:==日期 使用SimpleDateFormat的parse()方法
- public Date parse(String source):從給定字串的開始解析文字,以生成一個日期。
注:==解析和格式化的pattern格式得保持一致。=
demo
@Test public void test2() throws ParseException { //1.格式化1 SimpleDateFormat sdf = new SimpleDateFormat(); String date = sdf.format(new Date()); System.out.println(date);//18-12-8 下午3:17,預設格式 //2.格式化2 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); date = sdf1.format(new Date()); System.out.println(date);//2018-12-08T15:24:23.367+0800 //3.解析 Date date1 = sdf.parse("18-12-8 下午3:17"); System.out.println(date1);//Sat Dec 08 15:17:00 CST 2018 Date date2 = sdf1.parse("2018-12-08T15:24:23.367+0800"); System.out.println(date2); }
2.SimpleDateFormat 相關格式說明和理解
2.1 日期和時間模式
日期和時間格式由日期和時間模式 字串指定。在日期和時間模式字串中,未加引號的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 被解釋為模式字母,用來表示日期或時間字串元素。文字可以使用單引號 (’) 引起來,以免進行解釋。"’’" 表示單引號。所有其他字元均不解釋;只是在格式化時將它們簡單複製到輸出字串,或者在解析時與輸入字串進行匹配。
理解:即在解析和或者格式化的時候,只對字母進行解析,而被單引號括起來的子串不進行解析,及我們可以隨意拼接成我們想要格式,如:“hh ‘o’‘clock’ a, zzzz” 結果為:12 o’clock PM, Pacific Daylight Time ,“yyyy年MM月dd日” 結果為:2018年12月8日
定義了以下模式字母(所有其他字元 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 都被保留):
模式字母通常是重複的,其數量確定其精確表示:
-
Text: 對於格式化來說,如果模式字母的數量大於等於 4,則使用完全形式;否則,在可用的情況下使用短形式或縮寫形式。對於解析來說,兩種形式都是可接受的,與模式字母的數量無關。
-
Number: 對於格式化來說,模式字母的數量是最小的數位,如果數位不夠,則用 0 填充以達到此數量。對於解析來說,模式字母的數量被忽略,除非必須分開兩個相鄰欄位。
-
Year: 如果格式器的 Calendar 是格里高利曆,則應用以下規則。
- 對於格式化來說,如果模式字母的數量為 2,則年份擷取為 2 位數,否則將年份解釋為 number。
- 對於解析來說,如果模式字母的數量大於 2,則年份照字面意義進行解釋,而不管數位是多少。因此使用模式 “MM/dd/yyyy”,將 “01/11/12” 解析為公元 12 年 1 月 11 日。
- 在解析縮寫年份模式(“y” 或 “yy”)時,SimpleDateFormat 必須相對於某個世紀來解釋縮寫的年份。這通過將日期調整為 SimpleDateFormat 例項建立之前的 80 年和之後 20 年範圍內來完成。例如,在 “MM/dd/yy” 模式下,如果 SimpleDateFormat 例項是在 1997 年 1 月 1 日建立的,則字串 “01/11/12” 將被解釋為 2012 年 1 月 11 日,而字串 “05/04/64” 將被解釋為 1964 年 5 月 4 日。在解析時,只有恰好由兩位數字組成的字串(如 Character.isDigit(char) 所定義的)被解析為預設的世紀。其他任何數字字串將照字面意義進行解釋,例如單數字字串,3 個或更多數字組成的字串,或者不都是數字的兩位數字字串(例如"-1")。因此,在相同的模式下, “01/02/3” 或 “01/02/003” 解釋為公元 3 年 1 月 2 日。同樣,“01/02/-3” 解析為公元前 4 年 1 月 2 日。
否則,則應用日曆系統特定的形式。對於格式化和解析,如果模式字母的數量為 4 或大於 4,則使用日曆特定的 long form。否則,則使用日曆特定的 short or abbreviated form。
-
Month: 如果模式字母的數量為 3 或大於 3,則將月份解釋為 text;否則解釋為 number。
-
General time zone: 如果時區有名稱,則將它們解釋為 text。對於表示 GMT 偏移值的時區,使用以下語法:
GMTOffsetTimeZone:
GMT Sign Hours : Minutes
Sign: one of
+ -
Hours:
Digit
Digit Digit
Minutes:
Digit Digit
Digit: one of
0 1 2 3 4 5 6 7 8 9Hours 必須在 0 到 23 之間,Minutes 必須在 00 到 59 之間。格式是與語言環境無關的,並且數字必須取自 Unicode 標準的 Basic Latin 塊。
對於解析來說,RFC 822 time zones 也是可接受的。 -
RFC 822 time zone: 對於格式化來說,使用 RFC 822 4-digit 時區格式:
RFC822TimeZone:
Sign TwoDigitHours Minutes
TwoDigitHours:
Digit DigitTwoDigitHours 必須在 00 和 23 之間。其他定義請參閱 general time zones。
對於解析來說,general time zones 也是可接受的。
SimpleDateFormat 還支援本地化日期和時間模式 字串。在這些字串中,以上所述的模式字母可以用其他與語言環境有關的模式字母來替換。SimpleDateFormat 不處理除模式字母之外的文字本地化;而由類的客戶端來處理。
2.2 示例
以下示例顯示瞭如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 2001-07-04 12:08:56。
2.3 同步
日期格式是不同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,則它必須是外部同步的。