因爲Java8 以前的Date,SimpleDateFormat都是線程不安全的,因此Joda time就十分受歡迎。即使是Java8新出了一套了線程安全類,我看了一下也差點寫的吐了血。。。。java
請移步到Github下載。
我這裏依賴的是joda2.10,用的是junit4作的測試。
Talk is cheap, show me the fucking code(微笑)git
完整版點次連接github
import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.Date; public class JodaDateUtil { public enum Pattern { //若是不夠用能夠本身添加 yyyy_MM("yyyy-MM"), yyyyMM("yyyyMM"), yyyy_MM_dd("yyyy-MM-dd"), yyyyMMdd("yyyyMMdd"), yyyy_MM_dd_HH_mm_ss("yyyy-MM-dd HH:mm:ss"), yyyyMMddHHmmss("yyyyMMddHHmmss"), yyyy_MM_dd_HH_mm_ss_zh("yyyy年MM月dd日HH時mm分ss秒"), yyyy_MM_dd_HH_mm_ss_SSS("yyyy-MM-dd HH:mm:ss.SSS"), yyyy_MM_dd_zh("yyyy年MM月dd日"), yyyy_MM_dd_HH_mm_zh("yyyy年MM月dd日HH時mm分"); private String pattern; Pattern(String pattern) { this.pattern = pattern; } public String getPattern() { return pattern; } } public static Date str2date(String strTime, Pattern pattern) { DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern.getPattern()); DateTime dateTime = fmt.parseDateTime(strTime); return dateTime.toDate(); } public static Date str2date(String time) { return str2date(time, Pattern.yyyy_MM_dd_HH_mm_ss); } public static String date2str(Date date, Pattern pattern) { DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern.getPattern()); DateTime dateTime = new DateTime(date); return fmt.print(dateTime); }
後面的工具類代碼還有不少,好比獲取一個季度的最後一天,諸如此類,就不貼了。緩存
完整版連接:安全
public class JodaDateUtilTest { public static final String yyyy_MM = "2014-09"; public static final String yyyyMM = "201409"; public static final String yyyy_MM_dd = "2014-09-01"; public static final String yyyyMMdd = "20140901"; public static final String yyyy_MM_dd_HH_mm_ss = "2014-09-01 12:30:20"; public static final String yyyy_MM_dd_HH_mm_ss_SSS = "2014-09-01 12:30:20.100"; public static final DateTime dateTime; static { dateTime = new DateTime(2018, 8, 30, 12, 30, 20, 200); } @Test public void str2date() throws Exception { Date date = JodaDateUtil.str2date(yyyy_MM, JodaDateUtil.Pattern.yyyy_MM); System.out.println(date); date = JodaDateUtil.str2date(yyyy_MM_dd, JodaDateUtil.Pattern.yyyy_MM_dd); System.out.println(date); date = JodaDateUtil.str2date(yyyyMM, JodaDateUtil.Pattern.yyyyMM); System.out.println(date); date = JodaDateUtil.str2date(yyyyMMdd, JodaDateUtil.Pattern.yyyyMMdd); System.out.println(date); date = JodaDateUtil.str2date(yyyy_MM_dd_HH_mm_ss, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss); System.out.println(date); date = JodaDateUtil.str2date(yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS); System.out.println(date); } @Test public void date2str() throws Exception { String str = JodaDateUtil.date2str(dateTime.toDate(), JodaDateUtil.Pattern.yyyy_MM); System.out.println(str); str = JodaDateUtil.date2str(dateTime.toDate(), JodaDateUtil.Pattern.yyyy_MM_dd); System.out.println(str); str = JodaDateUtil.date2str(dateTime.toDate(), JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss); System.out.println(str); str = JodaDateUtil.date2str(dateTime.toDate(), JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS); System.out.println(str); } @Test public void strToStr() throws Exception { String str = JodaDateUtil.strToStr(yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM); System.out.println(str); str = JodaDateUtil.strToStr(yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_zh); System.out.println(str); str = JodaDateUtil.strToStr(yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_zh); System.out.println(str); str = JodaDateUtil.strToStr(yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_SSS, JodaDateUtil.Pattern.yyyy_MM_dd_HH_mm_ss_zh); System.out.println(str); } }
另外Joda底層會幫咱們緩存500個Formatter,應該能夠知足正常的需求了。
另外,本人還將Joda與常見使用ThreadLocal包一層的SimpleDateFormatter,進行了轉換比較,發現Joda比它快大約一個數量級。。。。。
若是你還用着ThreadLocal仍是趕忙換了吧。工具
Github地址https://github.com/codercuixi..., 本人也是小白,但願與你們共同進步,喜歡就follow,點贊哦測試