Java技能點之SimpleDateFormat進行日期格式化問題
SimpleDateFormat進行日期格式化
1.為啥要用SimpleDateFormat
眾所周知,Java中的日期類是Date,然后日期默認的輸出樣式很奇怪哦,是這樣子的:
package org.maoge.common;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) {
//默認輸出格式
Date date=new Date();
System.out.println(date);//Fri Oct 27 16:56:37 CST 2017
}
}
真的好像說,這是什么鬼啊,神經(jīng)病啊,老板要是發(fā)現(xiàn)你在前端把日期顯示成這樣子,非要…覺得你很有個性不可。
OK,所以就很需要將日期以一種我們想要的格式顯示出來。
另外,有時候我們需要指定一個日期,所以也需要將字符串類型轉(zhuǎn)換為Date類型,我們往往會以為是這樣子的:

首先我們就注意到了new Date()方法被劃上了刪除線,這個就表示該方法在定義的時候被@Deprecated注解注解過了,意思是該方法過期了不建議使用了可能有問題了,反正咱知道這個方法最好不用就是了。而且,確實也報錯了,所以我們也需要一種將字符串轉(zhuǎn)換為日期的方法。
SimpleDateFormat就是為這兩種需要誕生滴,類庫嘛,就是前人搭棚好乘涼,而且都是牛逼的前人。
2.日期格式化顯示
首先要記住一些標記:(注意大小寫)
- 年yyyy
- 月MM
- 日dd
- 時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) {
//默認輸出格式
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時mm分ss秒");//顯示2017年10月27日10時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時11分13秒
}
}
3.將字符串轉(zhuǎn)換為對應(yīng)日期
注意,因為可能定義的格式和實際字符串提供的格式不符合,所以會拋出異常
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");
//按格式進行轉(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);//報錯java.text.ParseException: Unparseable date: "20171027 10:00:00"
System.out.println(date2);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
SimpleDateFormat的使用及其注意事項
SimpleDateFormat API 簡介
/** ?* SimpleDateFormat ?* 一個與語言環(huán)境相關(guān)的格式化日期和分析日期的工具類。 ?* 利用該類可以將日期轉(zhuǎn)換成文本,或者將文本轉(zhuǎn)換成日期。 ?*? ?* 在使用SimpleDateFormat時需要指定一個需要的格式(pattern)來格式日期(Date). ?* 在此請注意幾個字母大小寫的差異: ?*? ?* 大寫的H為24小時制表示一天中的小時數(shù)(0-23) ?* 小寫的h為12小時制表示一天中的小時數(shù)(1-12) ?*? ?* 大寫的M表示年中的月份? ?* 小寫的m表示小時中的分鐘數(shù)? ?*? ?* 大寫的S表示毫秒數(shù) ?* 小寫的s表示秒數(shù) ?*? ?* 所以最常用的24小時制的具體日期的pattern為: ?* yyyy-MM-dd HH:mm:ss ?*? ?*? ?* SimpleDateFormat中format()方法小結(jié): ?* 1 format()方法的作用是將日期(Date)轉(zhuǎn)換為文本 ?* 2 format()方法的輸入?yún)?shù)是一個Date ?*? ?*? ?* SimpleDateFormat中parse()方法小結(jié): ?* 1 parse()方法的作用是將文本轉(zhuǎn)換為日期(Date) ?* 2 parse()方法的輸入?yún)?shù)是一個文本,比如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("----> 時間文本為: "+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: ----> 時間文本為: 2013-12-27 08:50:09
3. 將時間戳轉(zhuǎn)換成時間
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("----> 將時間戳轉(zhuǎn)換為字符串: "+time);
System.out.println("----------------------------------");輸出:
System.out: ----> 將時間戳轉(zhuǎn)換為字符串: 2019-05-23 22:36:27
4. 將時間轉(zhuǎn)換成時間戳
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("----> 當前時間戳為: "+timeStamp+" ,其字符串為:"+time);
Date parsedDate = simpleDateFormat.parse(time);
long ts = parsedDate.getTime();
System.out.println("----> 將字符串轉(zhuǎn)換為時間戳: "+ts);
System.out.println("----------------------------------");輸出:
----> 當前時間戳為: 1558622317494 ,其字符串為:2019-05-23 22:38:37
----> 將字符串轉(zhuǎn)換為時間戳: 1558622317000
5. java時間戳與unix時間戳的關(guān)系
/**
?* java中生成的時間戳精確到毫秒,但unix中精確到秒
?* 所以兩者相差1000倍
?*/
long javaTimeStamp = System.currentTimeMillis();
long unixTimeStamp = javaTimeStamp/1000;
System.out.println("----> java時間戳: " + javaTimeStamp+", unix時間戳:" + unixTimeStamp);
System.out.println("----------------------------------");輸出:
System.out: ----> java時間戳: 1558622474893 ,unix時間戳:1558622474
6. 計算兩個時間的差值
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("----> 兩個時間相距:"+days+"天");
? ?
} catch (Exception e) {
? ? System.out.println("----> Exception="+e.toString());
}
? ? System.out.println("----------------------------------");
}輸出:
System.out: ----> 兩個時間相距:833天
7. 比較兩個時間的大小
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)楠毾恚€程獨享肯定能比方法獨享在并發(fā)環(huán)境中能減少不少創(chuàng)建對象的開銷。如果對性能要求比較高的情況下,一般推薦使用這種方法。
Java 8 中的解決辦法
Java 8 提供了新的日期時間 API,其中包括用于日期時間格式化的 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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 加載 META-INF/spring.factories方式
這篇文章主要介紹了springboot 加載 META-INF/spring.factories方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
MybatisPlus使用Mybatis的XML的動態(tài)SQL的功能實現(xiàn)多表查詢
本文主要介紹了MybatisPlus使用Mybatis的XML的動態(tài)SQL的功能實現(xiàn)多表查詢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
Java封裝數(shù)組之改進為泛型數(shù)組操作詳解
這篇文章主要介紹了Java封裝數(shù)組之改進為泛型數(shù)組操作,結(jié)合實例形式詳細分析了Java封裝數(shù)組為泛型數(shù)組相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下2020-03-03

