一文搞懂Java中的日期類
一、日期類
在程序的開(kāi)發(fā)中我們經(jīng)常會(huì)遇到日期類型的操作,Java對(duì)日期類型的操作提供了很好的支持。在最初的版本下,java.lang包中的System.currentTimeMillis();可以獲取當(dāng)前時(shí)間與協(xié)調(diào)時(shí)間(UTC)1970年1月1日午夜之間的時(shí)間差(以毫秒為單位測(cè)量)。我們往往通過(guò)調(diào)用該方法計(jì)算某段代碼的耗時(shí)。
public class TestTime {
public static void main(String[] args) {
long start=System.currentTimeMillis();
long sum=0;
for (int i = 0; i < 1000000; i++) {
sum+=i;
}
System.out.println("sum="+sum);
long end=System.currentTimeMillis();
System.out.println("耗時(shí):"+(end-start)+"ms");
}
}
1.1 第一代日期類
第一代日期時(shí)間API主要有java.util.Date和日期時(shí)間格式化有關(guān)的java.text.DateFormat及其子類。
1.1.1 Date類
JDK1.0就在java.util包下面提供了Date類用于表示特定的瞬間,可以精確到毫秒。
通過(guò)API或源碼,可以看出Date類的大部分方法已經(jīng)過(guò)時(shí),已被第二代日期類Calendar代替,剩下的Date類常見(jiàn)方法如下所示。
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | Date() | 返回一個(gè)代表當(dāng)前系統(tǒng)時(shí)間的Date對(duì)象,精確到毫秒 |
| 2 | Date(long date) | 返回一個(gè)距離UTC時(shí)間date毫秒的新日期對(duì)象,精確到毫秒 |
| 3 | int compareTo(Date anotherDate) | 比較兩個(gè)日期的大小 |
| 4 | long getTime() | 返回自1970年1月1日00:00:00 GMT以來(lái)此Date對(duì)象表示的毫秒數(shù) |
| 5 | String toString() | 把此Date對(duì)象轉(zhuǎn)換為以下形式的String:dow mon dd hh:mm:ss zzz yyyy其中:dow是一周中的某一天(Sun,Mon,Tue,Wed,Thu,Fri,Sat) |
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
Date date = new Date();
System.out.println("現(xiàn)在的系統(tǒng)時(shí)間是:"+date);
long time=date.getTime();
System.out.println("當(dāng)前時(shí)間距離UTC時(shí)間的毫秒數(shù):"+time);
}
}

1.1.2 SimpleDateFormat類
Date類顯示的格式?jīng)]有考慮國(guó)際化問(wèn)題,如該格式不符合中國(guó)人查看時(shí)間的格式習(xí)慣,因此需要對(duì)其進(jìn)行格式化操作。java.text.SimpleDateFormat類可以實(shí)現(xiàn)格式化操作,它是java.text.DateFormat的子類。
創(chuàng)建SimpleDateFormat類的對(duì)象非常簡(jiǎn)單,可以使用如下構(gòu)造器:
- SimpleDateFormat():用默認(rèn)的模式和默認(rèn)的語(yǔ)言環(huán)境的日期格式符號(hào)構(gòu)造SimpleDateFormat。
- SimpleDateFormat(String pattern):用給定的模式和默認(rèn)語(yǔ)言環(huán)境的日期格式符號(hào)構(gòu)造SimpleDateFormat。
- SimpleDateFormat(String pattern,Locale locale):用給定的模式和給定語(yǔ)言環(huán)境的日期格式符號(hào)構(gòu)造。
常見(jiàn)的日期格式化模板如下:

SimpleDataFormat類主要用于將Date日期轉(zhuǎn)換為字符串,或者將某個(gè)字符串轉(zhuǎn)換為Date對(duì)象,其常見(jiàn)方法如下所示:
| 方法定義 | 描述 |
|---|---|
| format | 將一個(gè)Date格式轉(zhuǎn)化為日期/時(shí)間字符串,此方法繼承的父類DateFormat的方法 |
| parse | 從給定字符串的開(kāi)始解析文本,以生成一個(gè)日期,此方法為繼承的父類DateFormat的方法 |
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH小時(shí)mm分鐘ss秒S毫秒");
System.out.println("使用指定格式的日期字符串:"+sdf.format(new Date()));
String str="2021年1月15日 06小時(shí)44分鐘05秒 123毫秒";
Date date = sdf.parse(str);
System.out.println("日期對(duì)象:"+date);
}
}

1.2 第二代日期類Calendar
Date類用于返回日期對(duì)象,不適合獲取日歷字段。設(shè)置和獲取日歷字段的方法,被JDK1.1推出的Calendar代替。
java.util.Calendar類是一個(gè)抽象類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日歷字段之間的轉(zhuǎn)換提供了一些方法,并為操作日歷字段(如獲得下星期的日期)提供了一些方法。
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static getInstance() | 使用默認(rèn)時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷,也可以通過(guò)getInstance(TimeZone time,Locale loc)或指定時(shí)區(qū)和語(yǔ)言環(huán)境的日歷 |
| 2 | get(int field) | 獲取指定的日歷字段 |
| 3 | set(int year,int month,int date,int hourOfDay,int minute,int second) | 設(shè)置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值 |
public class CalendarTest {
public static void main(String[] args) {
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
System.out.println("年:"+c.get(Calendar.YEAR));
System.out.println("月:"+(c.get(Calendar.MONTH)+1));//1月從0開(kāi)始
System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("小時(shí):"+c.get(Calendar.HOUR));
System.out.println("分鐘:"+c.get(Calendar.MINUTE));
System.out.println("秒:"+c.get(Calendar.SECOND));
}
}

上述代碼中的TimeZone表示時(shí)區(qū),Locale表示語(yǔ)言環(huán)境。例如TimeZone.getTimeZone("Asia/Shanghai")表示“亞洲/上海”時(shí)區(qū),Locale.CHINA表示中國(guó)語(yǔ)言環(huán)境。
1.3 第三代日期類
java8中引入的java.time糾正了過(guò)去的缺陷,這就是第三代日期API。
java8吸收了Joda-Time的精華,以一個(gè)新的開(kāi)始為Java創(chuàng)建優(yōu)秀的API。新的java.time中包含了所有關(guān)于本地日期(LocalDate)、本地時(shí)間(LocalTime)、本地日期時(shí)間(LocalDateTime)、時(shí)區(qū)(ZonedDateTime)和持續(xù)時(shí)間(Duration)的類。歷史悠久的Date類也新增了toInstant()方法,用于把Date類轉(zhuǎn)換成新的表示形式。
接下來(lái)只介紹商用的幾個(gè)類型。
1.3.1 LocalDate、LocalTime、LocalDateTime類
這三個(gè)類都代表日期對(duì)象,只是包含的日歷字段不同,相當(dāng)于Calendar類的代替。
java.time.LocalDate類:代表一個(gè)只包含年、月、日的日期對(duì)象,如2007-12-03。LocalDate類常見(jiàn)方法如下所示。
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static LocalDate now() | 返回默認(rèn)時(shí)區(qū)下的當(dāng)前日期對(duì)象 |
| 2 | int getYear() | 返回年份,從-999999999-01-01~+999999999-12-31 |
| 3 | int getMonth() | 返回月份,1-12 |
| 4 | int getDayOfMonth() | 返回日期,1-31 |
| 5 | LocalDate parse(CharSequence text) | 按默認(rèn)格式解析字符串為L(zhǎng)ocalDate的日期對(duì)象 |
| 6 | LocalDate parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串為L(zhǎng)ocalDate的日期對(duì)象 |
java.time.LocalTime類:代表一個(gè)只包含小時(shí)、分鐘、秒的日期對(duì)象,如13:45.30.123456789。LocalTime常見(jiàn)方法如下:
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static LocalTime now() | 返回默認(rèn)時(shí)區(qū)下的當(dāng)前時(shí)間對(duì)象 |
| 2 | int getHour() | 返回小時(shí),0-23 |
| 3 | int getMinute() | 返回分鐘,0-59 |
| 4 | int getSecond() | 返回秒,0-59 |
| 5 | LocalTime parse(CharSequence text) | 按默認(rèn)格式解析字符串為L(zhǎng)ocalTime的日期對(duì)象 |
| 6 | LocalTime parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串為L(zhǎng)ocalTime的日期對(duì)象 |
java.time.LocalDateTime類:代表一個(gè)包含年、月、日、小時(shí)、分鐘、秒的日期對(duì)象,如2007-12-03T10:15:30。LocalDateTime常見(jiàn)方法如下:
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static LocalDateTime now() | 返回默認(rèn)時(shí)區(qū)下的當(dāng)前日期對(duì)象 |
| 2 | int getYear() | 返回年份,從-999999999-01-01~+999999999-12-31 |
| 3 | int getMonth() | 返回月份,1-12 |
| 4 | int getDayOfMonth() | 返回日期:1-31 |
| 5 | int getHour() | 返回小時(shí):0-23 |
| 6 | int getMinute() | 返回分鐘:0-59 |
| 7 | int getSecond() | 返回秒:0-59 |
| 8 | LocalDateTime parse(CharSequence text) | 按默認(rèn)格式解析字符串為L(zhǎng)ocalDateTime的日期對(duì)象 |
| 9 | LocalDateTime parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串為L(zhǎng)ocalDateTime的日期對(duì)象 |
import java.time.LocalDateTime;
public class LocalDateTimeTest {
public static void main(String[] args) {
//1、創(chuàng)建一個(gè)日期對(duì)象
LocalDateTime now = LocalDateTime.now();
//2、獲取日歷字段
System.out.println("年:"+now.getYear());
System.out.println("月:"+now.getMonthValue());
System.out.println("月:"+now.getMonth());
System.out.println("日:"+now.getDayOfMonth());
System.out.println("小時(shí):"+now.getHour());
System.out.println("分鐘:"+now.getMinute());
System.out.println("秒:"+now.getSecond());
}
}

1.3.2 Instant類
在處理時(shí)間和日期時(shí),我們通常會(huì)想到年、月、日、時(shí)、分、秒。然而,這只是時(shí)間的一個(gè)模型,是面向人類的。第二種通用模型是面向計(jì)算機(jī)的,在此模型中,時(shí)間線中的一個(gè)點(diǎn)表示一個(gè)整數(shù),這有利于計(jì)算機(jī)處理。在UNIX中這個(gè)數(shù)從1970年開(kāi)始,以秒為單位;同樣在Java中也是從1970年開(kāi)始的,但以毫秒為單位。
java.time包通過(guò)值類型Instant提供機(jī)器視圖,不提供人類意義上的時(shí)間單位。Instant類表示時(shí)間線商的一點(diǎn),不需要要任何上下文信息。例如,時(shí)區(qū)。從概念上講,它只是簡(jiǎn)單地表示自1970年1月1日0時(shí)0分0秒(UTC)開(kāi)始地秒數(shù)。因?yàn)閖ava.time包是基于納秒計(jì)算的,所以Instant類的精度可以達(dá)到納秒級(jí)。
Instant類的常見(jiàn)方法如下:
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static Instant now() | 靜態(tài)方法,返回默認(rèn)UTC時(shí)區(qū)的Instant類的對(duì)象 |
| 2 | static Instant ofEpochMillo(long epochMilli) | 靜態(tài)方法,返回在1970-01-01 00:00:00基礎(chǔ)上加上指定毫秒數(shù)之后的Instant類的對(duì)象 |
| 3 | static OffsetDateTime atOffset(ZoneOffset offset) | 結(jié)合即時(shí)的便宜來(lái)創(chuàng)建一個(gè)OffsetDateTime |
| 4 | long toEpochMilli() | 返回1970-01-01 00:00:00到當(dāng)前時(shí)間的毫秒數(shù),即時(shí)間戳 |
Instant類和第一代日期類Date的相互轉(zhuǎn)換:
import java.time.Instant;
import java.util.Date;
public class InstantTest {
public static void main(String[] args) {
//1、創(chuàng)建一個(gè)Instant對(duì)象
Instant now = Instant.now();
System.out.println("now="+now);
//2、轉(zhuǎn)換方法
//[1]Instant->Date
Date d = Date.from(now);
System.out.println("d="+d);
//[2]Date->Instant
Instant instant = d.toInstant();
System.out.println("instant="+instant);
}
}

1.3.3 DateTimeFormatter類
java.time.format.DateTimeFormatter類提供了格式化日期的方法,這個(gè)類和第一代日期的SimpleDateFormatter類似,但SimpleDateFormat只能格式化Date類,對(duì)Calendar類無(wú)效。DateTimeFormatter可以格式化LocalDate、LocalTime、LocalDateTime及Instant類。
DateTimeFormatter類常見(jiàn)方法如下:
| 序號(hào) | 方法定義 | 描述 |
|---|---|---|
| 1 | static DateTimeFormatter ofPattern(String pattern) | 靜態(tài)方法,返回一個(gè)DateTimeFormatter對(duì)象 |
| 2 | String format(TemporalAccessor t) | 格式化一個(gè)日期、時(shí)間,返回字符串 |
| 3 | TemporalAccessor parse(CharSequence text) | 將指定格式的字符序列解析為一個(gè)日期、時(shí)間 |
TemporalAccessor 是java.time.temporal包下的接口,LocalDate、LocalTime、LocalDateTime、Instant都實(shí)現(xiàn)了該接口。
下面以LocalDateTime日期的格式為例,進(jìn)行代碼演示。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterTest {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd a hh小時(shí)mm分鐘ss秒");
//格式化日期(日期->文本)
String format = dtf.format(now);
System.out.println(format);
//解析字符串為日期(文本->日期)
String s="2018-08-08 下午 05小時(shí)06分鐘43秒";
LocalDateTime parse = LocalDateTime.parse(s, dtf);
System.out.println(parse);
}
}

以上就是一文搞懂Java中的日期類的詳細(xì)內(nèi)容,更多關(guān)于Java日期類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java正則表達(dá)式匹配網(wǎng)頁(yè)所有網(wǎng)址和鏈接文字的示例
這篇文章主要介紹了java正則表達(dá)式匹配網(wǎng)頁(yè)所有網(wǎng)址和鏈接文字java正則表達(dá)式匹配,需要的朋友可以參考下2014-03-03
eclipse創(chuàng)建項(xiàng)目沒(méi)有dynamic web的解決方法
最近上課要用到eclipse,要用到Dynamic web project.但是我下載的版本上沒(méi)有.接下來(lái)就帶大家了解 eclipse創(chuàng)建項(xiàng)目沒(méi)有dynamic web的解決方法,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06
Java開(kāi)發(fā)中的23種設(shè)計(jì)模式詳解(推薦)
本篇文章主要介紹了Java開(kāi)發(fā)中的23種設(shè)計(jì)模式詳解,現(xiàn)在分享給大家,也給大家做個(gè)參考。感興趣的小伙伴們可以參考一下。 設(shè)計(jì)模式(Design Patterns)2016-11-11
java解決動(dòng)態(tài)配置字段需求問(wèn)題
這篇文章主要介紹了java解決動(dòng)態(tài)配置字段需求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Java中jdk1.8和jdk17相互切換實(shí)戰(zhàn)步驟
之前做Java項(xiàng)目時(shí)一直用的是jdk1.8,現(xiàn)在想下載另一個(gè)jdk版本17,并且在之后的使用中可以進(jìn)行相互切換,下面這篇文章主要給大家介紹了關(guān)于Java中jdk1.8和jdk17相互切換的相關(guān)資料,需要的朋友可以參考下2023-05-05
詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎
這篇文章主要介紹了詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

