Java技能點(diǎn)之SimpleDateFormat進(jìn)行日期格式化問題
SimpleDateFormat進(jìn)行日期格式化
1.為啥要用SimpleDateFormat
眾所周知,Java中的日期類是Date,然后日期默認(rèn)的輸出樣式很奇怪哦,是這樣子的:
package org.maoge.common; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { //默認(rèn)輸出格式 Date date=new Date(); System.out.println(date);//Fri Oct 27 16:56:37 CST 2017 } }
真的好像說,這是什么鬼啊,神經(jīng)病啊,老板要是發(fā)現(xiàn)你在前端把日期顯示成這樣子,非要…覺得你很有個(gè)性不可。
OK,所以就很需要將日期以一種我們想要的格式顯示出來。
另外,有時(shí)候我們需要指定一個(gè)日期,所以也需要將字符串類型轉(zhuǎn)換為Date類型,我們往往會以為是這樣子的:
首先我們就注意到了new Date()
方法被劃上了刪除線,這個(gè)就表示該方法在定義的時(shí)候被@Deprecated
注解注解過了,意思是該方法過期了不建議使用了可能有問題了,反正咱知道這個(gè)方法最好不用就是了。而且,確實(shí)也報(bào)錯(cuò)了,所以我們也需要一種將字符串轉(zhuǎn)換為日期的方法。
SimpleDateFormat就是為這兩種需要誕生滴,類庫嘛,就是前人搭棚好乘涼,而且都是牛逼的前人。
2.日期格式化顯示
首先要記住一些標(biāo)記:(注意大小寫)
- 年yyyy
- 月MM
- 日dd
- 時(shí)HH
- 分mm
- 秒ss
- 毫秒SS
然后直接看例子:
package org.maoge.common; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { //默認(rèn)輸出格式 Date date=new Date(); System.out.println(date);//Fri Oct 27 16:56:37 CST 2017 //日期格式化顯示,首先定義格式 SimpleDateFormat sdf1=new SimpleDateFormat("yyyyMMdd");//顯示20171027格式 SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");//顯示2017-10-27格式 SimpleDateFormat sdf3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//顯示2017-10-27 10:00:00格式 SimpleDateFormat sdf4=new SimpleDateFormat("yyyy年MM月dd日HH時(shí)mm分ss秒");//顯示2017年10月27日10時(shí)00分00秒格式 //將格式應(yīng)用于日期 System.out.println(sdf1.format(date));//20171027 System.out.println(sdf2.format(date));//2017-10-27 System.out.println(sdf3.format(date));//2017-10-27 17:11:13 System.out.println(sdf4.format(date));//2017年10月27日17時(shí)11分13秒 } }
3.將字符串轉(zhuǎn)換為對應(yīng)日期
注意,因?yàn)榭赡芏x的格式和實(shí)際字符串提供的格式不符合,所以會拋出異常
package org.maoge.common; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { //首先定義格式 SimpleDateFormat sdf1=new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //按格式進(jìn)行轉(zhuǎn)換 String strDate1="20151010";//符合sdf1格式 String strDate2="20171027 10:00:00";//不符合格式 try { Date date1=sdf1.parse(strDate1); System.out.println(date1);//正常輸出Sat Oct 10 00:00:00 CST 2015 Date date2=sdf2.parse(strDate2);//報(bào)錯(cuò)java.text.ParseException: Unparseable date: "20171027 10:00:00" System.out.println(date2); } catch (ParseException e) { e.printStackTrace(); } } }
SimpleDateFormat的使用及其注意事項(xiàng)
SimpleDateFormat API 簡介
/** ?* SimpleDateFormat ?* 一個(gè)與語言環(huán)境相關(guān)的格式化日期和分析日期的工具類。 ?* 利用該類可以將日期轉(zhuǎn)換成文本,或者將文本轉(zhuǎn)換成日期。 ?*? ?* 在使用SimpleDateFormat時(shí)需要指定一個(gè)需要的格式(pattern)來格式日期(Date). ?* 在此請注意幾個(gè)字母大小寫的差異: ?*? ?* 大寫的H為24小時(shí)制表示一天中的小時(shí)數(shù)(0-23) ?* 小寫的h為12小時(shí)制表示一天中的小時(shí)數(shù)(1-12) ?*? ?* 大寫的M表示年中的月份? ?* 小寫的m表示小時(shí)中的分鐘數(shù)? ?*? ?* 大寫的S表示毫秒數(shù) ?* 小寫的s表示秒數(shù) ?*? ?* 所以最常用的24小時(shí)制的具體日期的pattern為: ?* yyyy-MM-dd HH:mm:ss ?*? ?*? ?* SimpleDateFormat中format()方法小結(jié): ?* 1 format()方法的作用是將日期(Date)轉(zhuǎn)換為文本 ?* 2 format()方法的輸入?yún)?shù)是一個(gè)Date ?*? ?*? ?* SimpleDateFormat中parse()方法小結(jié): ?* 1 parse()方法的作用是將文本轉(zhuǎn)換為日期(Date) ?* 2 parse()方法的輸入?yún)?shù)是一個(gè)文本,比如String */
1. 將日期轉(zhuǎn)換為文本
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String time = simpleDateFormat.format(date); System.out.println("----> 格式化后的日期為: "+time); System.out.println("----------------------------------");
輸出:
System.out: ----> 格式化后的日期為: 2019-05-23 22:28:01
System.out: ----------------------------------
2. 將文本轉(zhuǎn)換為日期
/** ? * 請注意: ? *? ? * 文本的格式應(yīng)該與 SimpleDateFormat 中的 pattern 保持一致,否則導(dǎo)致異常 ? * 比如: ? * 2008年08月18日 20:07:33 ? 對應(yīng)于yyyy年MM月dd日 HH:mm:ss ? * 2008-08-18 20:07:33 ? ? ? ? ? 對應(yīng)于yyyy-MM-dd HH:mm:ss */ private void test2() { ? try { ? ? ? ? String day = "2008年08月18日 20:07:33"; ? ? ? ? SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault()); ? ? ? ? Date date = simpleDateFormat.parse(day); ? ? ? ? System.out.println("----> 格式化后的日期為: "+date); ? ? ? ? day = "2008-08-18 20:07:33"; ? ? ? ? simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); ? ? ? ? date = simpleDateFormat.parse(day); ? ? ? ? System.out.println("----> 格式化后的日期為: "+date); ? ? ? ? day = "20131227085009"; ? ? ? ? simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()); ? ? ? ? date = simpleDateFormat.parse(day); ? ? ? ? simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); ? ? ? ? String time = simpleDateFormat.format(date); ? ? ? ? System.out.println("----> 時(shí)間文本為: "+time); ? ? ? ? System.out.println("----------------------------------"); ? ? } catch (Exception e) { ? ? ? ? System.out.println("----> Exception: "+e.toString()); ? ? } }
輸出:
System.out: ----> 格式化后的日期為: Mon Aug 18 20:07:33 GMT+08:00 2008
System.out: ----> 格式化后的日期為: Mon Aug 18 20:07:33 GMT+08:00 2008
System.out: ----> 時(shí)間文本為: 2013-12-27 08:50:09
3. 將時(shí)間戳轉(zhuǎn)換成時(shí)間
long timeStamp=System.currentTimeMillis(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); Date date = new Date(timeStamp); String time = simpleDateFormat.format(date); System.out.println("----> 將時(shí)間戳轉(zhuǎn)換為字符串: "+time); System.out.println("----------------------------------");
輸出:
System.out: ----> 將時(shí)間戳轉(zhuǎn)換為字符串: 2019-05-23 22:36:27
4. 將時(shí)間轉(zhuǎn)換成時(shí)間戳
long timeStamp = System.currentTimeMillis(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); Date date = new Date(timeStamp); String time = simpleDateFormat.format(date); System.out.println("----> 當(dāng)前時(shí)間戳為: "+timeStamp+" ,其字符串為:"+time); Date parsedDate = simpleDateFormat.parse(time); long ts = parsedDate.getTime(); System.out.println("----> 將字符串轉(zhuǎn)換為時(shí)間戳: "+ts); System.out.println("----------------------------------");
輸出:
----> 當(dāng)前時(shí)間戳為: 1558622317494 ,其字符串為:2019-05-23 22:38:37
----> 將字符串轉(zhuǎn)換為時(shí)間戳: 1558622317000
5. java時(shí)間戳與unix時(shí)間戳的關(guān)系
/** ?* java中生成的時(shí)間戳精確到毫秒,但unix中精確到秒 ?* 所以兩者相差1000倍 ?*/ long javaTimeStamp = System.currentTimeMillis(); long unixTimeStamp = javaTimeStamp/1000; System.out.println("----> java時(shí)間戳: " + javaTimeStamp+", unix時(shí)間戳:" + unixTimeStamp); System.out.println("----------------------------------");
輸出:
System.out: ----> java時(shí)間戳: 1558622474893 ,unix時(shí)間戳:1558622474
6. 計(jì)算兩個(gè)時(shí)間的差值
private String time1="2016-01-02 00:00:00"; private String time2="2013-09-21 00:00:00"; private void getTimeDifference(String time1,String time2) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); try { ? ?Date date1 = simpleDateFormat.parse(time1); ? ?Date date2 = simpleDateFormat.parse(time2); ? ?long difference = date1.getTime() - date2.getTime(); ? ?long days = difference / (1000 * 60 * 60 * 24); ? ?System.out.println("----> 兩個(gè)時(shí)間相距:"+days+"天"); ? ? } catch (Exception e) { ? ? System.out.println("----> Exception="+e.toString()); } ? ? System.out.println("----------------------------------"); }
輸出:
System.out: ----> 兩個(gè)時(shí)間相距:833天
7. 比較兩個(gè)時(shí)間的大小
private void compareTime(String time1, String time2) { ? ? SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); ? ? Calendar calendar1 = java.util.Calendar.getInstance(); ? ? Calendar calendar2 = java.util.Calendar.getInstance(); ? ? try { ? ? ? ? calendar1.setTime(dateFormat.parse(time1)); ? ? ? ? calendar2.setTime(dateFormat.parse(time2)); ? ? } catch (java.text.ParseException e) { ? ? ? ? System.out.println("----> Exception=" + e.toString()); ? ? } ? ? int result = calendar1.compareTo(calendar2); ? ? if (result == 0){ ? ? ? ? System.out.println("----> time1等于time2"); ? ? }else if (result < 0) { ? ? ? ? System.out.println("----> time1小于time2"); ? ? }else { ? ? ? ? System.out.println("----> time1大于time2"); ? ? } }
輸出:
System.out: ----> time1大于time2
8. 線程安全的使用方法
ThreadLocal
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ConcurrentDateUtil { ? ? private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { ? ? ? ? @Override ? ? ? ? protected DateFormat initialValue() { ? ? ? ? ? ? return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ? ? ? ? } ? ? }; ? ? public static Date parse(String dateStr) throws ParseException { ? ? ? ? return threadLocal.get().parse(dateStr); ? ? } ? ? public static String format(Date date) { ? ? ? ? return threadLocal.get().format(date); ? ? } }
使用 ThreadLocal, 也是將共享變量變?yōu)楠?dú)享,線程獨(dú)享肯定能比方法獨(dú)享在并發(fā)環(huán)境中能減少不少創(chuàng)建對象的開銷。如果對性能要求比較高的情況下,一般推薦使用這種方法。
Java 8 中的解決辦法
Java 8 提供了新的日期時(shí)間 API,其中包括用于日期時(shí)間格式化的 DateTimeFormatter,它與 SimpleDateFormat 最大的區(qū)別在于:DateTimeFormatter 是線程安全的,而 SimpleDateFormat 并不是線程安全。
- 解析日期
String dateStr= "2018年06月20日"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); ?? LocalDate date= LocalDate.parse(dateStr, formatter);
- 日期轉(zhuǎn)換為字符串
LocalDateTime now = LocalDateTime.now(); ? DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a"); String nowStr = now.format(format);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)多線程的兩種方式繼承Thread類和實(shí)現(xiàn)Runnable接口的方法
下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)多線程的兩種方式繼承Thread類和實(shí)現(xiàn)Runnable接口的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09一篇文章帶你了解Java Spring基礎(chǔ)與IOC
這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細(xì),也運(yùn)用了大量的代碼進(jìn)行講解,感興趣的小伙伴可以參考一下2021-08-08SpringBoot快速入門及起步依賴解析(實(shí)例詳解)
SpringBoot?是由?Pivotal?團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化?Spring?應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了SpringBoot快速入門及起步依賴解析,需要的朋友可以參考下2022-10-10ArrayList及HashMap的擴(kuò)容規(guī)則講解
今天小編就為大家分享一篇關(guān)于ArrayList及HashMap的擴(kuò)容規(guī)則講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02