https://www.cnblogs.com/zhisheng/p/9206758.html
在看的過程中有這么一條:
【強制】SimpleDateFormat 是線程不安全的類,一般不要定義為 static 變量,如果定義為 static,必須加鎖,或者使用 DateUtils 工具類。
看到這條我立馬就想起了我實習的時候有個項目里面就犯了這個錯誤,記得當時是這樣寫的:
private static final SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
所以才認真的去研究下這個 SimpleDateFormat,所以才有了這篇文章。
它是誰?
想必大家對 SimpleDateFormat
並不陌生。SimpleDateFormat
是 Java 中一個非常常用的類,他是以區域敏感的方式格式化和解析日期的具體類。 它允許格式化 (date -> text)、語法分析 (text -> date)和標准化。
SimpleDateFormat
允許以任何用戶指定的日期-時間格式方式啟動。 但是,建議使用 DateFormat
中的 getTimeInstance
、 getDateInstance
或 getDateTimeInstance
方法來創建一個日期-時間格式。 這幾個方法會返回一個默認的日期/時間格式。 你可以根據需要用 applyPattern
方法修改格式方式。
日期時間格式
日期和時間格式由 日期和時間模式字符串 指定。在 日期和時間模式字符串 中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字符串元素。文本可以使用單引號 (') 引起來,以免進行解釋。所有其他字符均不解釋,只是在格式化時將它們簡單復制到輸出字符串。
簡單的講:這些 A ——Z,a —— z 這些字母(不被單引號包圍的)會被特殊處理替換為對應的日期時間,其他的字符串還是原樣輸出。
日期和時間模式(注意大小寫,代表的含義是不同的)如下:
怎么使用?
日期/時間格式模版樣例:(給的時間是:2001-07-04 12:08:56 U.S. Pacific Time time zone)
使用方法:
import java.text.SimpleDateFormat; import java.util.Date; /** * Created by zhisheng_tian on 2018/6/19 */ public class FormatDateTime { public static void main(String[] args) { SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm"); SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等價於now.toLocaleString() SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒 E "); SimpleDateFormat myFmt4 = new SimpleDateFormat("一年中的第 D 天 一年中第w個星期 一月中第W個星期 在一天中k時 z時區"); Date now = new Date(); System.out.println(myFmt.format(now)); System.out.println(myFmt1.format(now)); System.out.println(myFmt2.format(now)); System.out.println(myFmt3.format(now)); System.out.println(myFmt4.format(now)); System.out.println(now.toGMTString()); System.out.println(now.toLocaleString()); System.out.println(now.toString()); } }
結果是:
2018年06月19日 23時10分05秒 18/06/19 23:10 2018-06-19 23:10:05 2018年06月19日 23時10分05秒 星期二 一年中的第 170 天 一年中第25個星期 一月中第4個星期 在一天中23時 CST時區 19 Jun 2018 15:10:05 GMT 2018-6-19 23:10:05 Tue Jun 19 23:10:05 CST 2018
使用方法很簡單,就是先自己定義好時間/日期模版,然后調用 format 方法(傳入一個時間 Date 參數)。
上面的是日期轉換成自己想要的字符串格式。下面反過來,將字符串類型裝換成日期類型:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by zhisheng_tian on 2018/6/19 */ public class StringFormatDate { public static void main(String[] args) { String time1 = "2018年06月19日 23時10分05秒"; String time2 = "18/06/19 23:10"; String time3 = "2018-06-19 23:10:05"; String time4 = "2018年06月19日 23時10分05秒 星期二"; SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm"); SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等價於now.toLocaleString() SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒 E"); Date date1 = null; try { date1 = myFmt.parse(time1); } catch (ParseException e) { e.printStackTrace(); } System.out.println(date1); Date date2 = null; try { date2 = myFmt1.parse(time2); } catch (ParseException e) { e.printStackTrace(); } System.out.println(date2); Date date3 = null; try { date3 = myFmt2.parse(time3); } catch (ParseException e) { e.printStackTrace(); } System.out.println(date3); Date date4 = null; try { date4 = myFmt3.parse(time4); } catch (ParseException e) { e.printStackTrace(); } System.out.println(date4); } }
結果是:
Tue Jun 19 23:10:05 CST 2018 Tue Jun 19 23:10:00 CST 2018 Tue Jun 19 23:10:05 CST 2018 Tue Jun 19 23:10:05 CST 2018