1. 程式人生 > >java 日期格式化類SimpleDateFormat的使用:日期轉字元,字元轉日期

java 日期格式化類SimpleDateFormat的使用:日期轉字元,字元轉日期

java 日期格式化類SimpleDateFormat的使用:日期轉字元,字元轉日期


部落格背景,本人是名java實習生,在實習階段遇到了遇到了業務需求非常奇葩的醫療軟體,其對時間格式的要求非常的奇葩,所以寫這篇部落格以總結和記錄 SimpleDateFormat類日期格式轉換的用法。

1. java.text.SimpleDateFormat類

  1. SimpleDateFormat是一個不與語言環境有關的方式來格式化和解析日期的具體類。
  2. 它允許進行格式化(日期文字)、解析(文字日期)

==格式化:==文字 使用SimpleDateFormat的format()方法

  1. SimpleDateFormat() :預設的模式和語言環境建立物件
  2. public SimpleDateFormat(String pattern):該構造方法可以用引數pattern指定的格式建立一個物件,該物件呼叫:
  3. public String format(Date date):方法格式化時間物件date

==解析:==日期 使用SimpleDateFormat的parse()方法

  1. 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’ 都被保留):
api
模式字母通常是重複的,其數量確定其精確表示:

  1. Text: 對於格式化來說,如果模式字母的數量大於等於 4,則使用完全形式;否則,在可用的情況下使用短形式或縮寫形式。對於解析來說,兩種形式都是可接受的,與模式字母的數量無關。

  2. Number: 對於格式化來說,模式字母的數量是最小的數位,如果數位不夠,則用 0 填充以達到此數量。對於解析來說,模式字母的數量被忽略,除非必須分開兩個相鄰欄位。

  3. 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。

  1. Month: 如果模式字母的數量為 3 或大於 3,則將月份解釋為 text;否則解釋為 number。

  2. 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 也是可接受的。

  3. 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 同步

日期格式是不同步的。建議為每個執行緒建立獨立的格式例項。如果多個執行緒同時訪問一個格式,則它必須是外部同步的。