因为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,点赞哦测试