一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類
一. 概念簡(jiǎn)介
在開(kāi)始學(xué)習(xí)今天的知識(shí)之前,有必要先給大家講解一下與今天內(nèi)容相關(guān)的一些概念,否則可能會(huì)讓一些小白產(chǎn)生迷惑。
1. 日期和時(shí)間的區(qū)別
首先我們得搞清楚,日期和時(shí)間的概念并不一樣。日期是指某一天,它不是連續(xù)變化的,可以說(shuō)是離散的。而時(shí)間有兩種概念,一種是不帶日期的時(shí)間,如10:30:01;另一種是帶日期的時(shí)間,如2023-01-01 15:11:40。只有帶日期的時(shí)間,才能唯一確定某個(gè)時(shí)刻,而不帶日期的時(shí)間是無(wú)法確定一個(gè)唯一時(shí)刻的。
2. 本地時(shí)間
本地時(shí)間其實(shí)就是每個(gè)地方,當(dāng)前所在國(guó)家所采用的標(biāo)準(zhǔn)時(shí)間。比如我們國(guó)家就是采用的北京時(shí)間,只要是在中國(guó)大陸,我們說(shuō)晚上8:00見(jiàn),這個(gè)8:00指的就是北京時(shí)間。即使我們國(guó)家的時(shí)區(qū),其實(shí)包括了從東五區(qū)到東九區(qū)共5個(gè)時(shí)區(qū),但我們?nèi)珖?guó)都是統(tǒng)一采用的東八區(qū)的區(qū)時(shí),這樣各地區(qū)人員之間的交流才不會(huì)產(chǎn)生歧義。但如果是在別的國(guó)家,那這個(gè)本地時(shí)間,就是他們國(guó)家的標(biāo)準(zhǔn)區(qū)時(shí)了,所以每個(gè)國(guó)家的標(biāo)準(zhǔn)區(qū)時(shí)可能是不同的。
3. 時(shí)區(qū)表示法
我們初中學(xué)地里的時(shí)候,就學(xué)過(guò)時(shí)區(qū)的概念,這里就不多講了。在計(jì)算機(jī)中,如果我們想準(zhǔn)確地確定一個(gè)時(shí)間,需要把本地時(shí)間和時(shí)區(qū)結(jié)合在一起才行。其中時(shí)區(qū)有如下幾種表示方式:
GMT 或 UTC 加時(shí)區(qū)偏移表示法:如GMT+08:00 或 UTC+08:00,就表示東八區(qū)的時(shí)間。因?yàn)楸本r(shí)區(qū)是東八區(qū),領(lǐng)先UTC 8個(gè)小時(shí),所以將UTC裝換成北京時(shí)間時(shí),要加上8小時(shí)。GMT(Greenwich Mean Time)是格林威治標(biāo)準(zhǔn)時(shí)間,UTC(Universal Time Coordinated)是世界統(tǒng)一時(shí)間或世界標(biāo)準(zhǔn)時(shí)間, GMT 和 UTC 其實(shí)基本是等價(jià)的,它們都是英國(guó)倫敦的本地時(shí)間。但UTC使用了更精確的原子鐘計(jì)時(shí),每隔幾年會(huì)有一個(gè)閏秒,不過(guò)我們?cè)陂_(kāi)發(fā)時(shí)可以忽略兩者的誤差,因?yàn)橛?jì)算機(jī)的時(shí)鐘在聯(lián)網(wǎng)時(shí)會(huì)自動(dòng)與時(shí)間服務(wù)器同步時(shí)間。
時(shí)區(qū)縮寫(xiě)表示法:如CST是China Standard Time的縮寫(xiě),即中國(guó)標(biāo)準(zhǔn)時(shí)間。但CST也是美國(guó)中部時(shí)間Central Standard Time USA的縮寫(xiě),因此有些縮寫(xiě)容易產(chǎn)生混淆,開(kāi)發(fā)時(shí)盡量不要使用縮寫(xiě)形式。
洲/城市表示法:如Asia/Shanghai,表示上海所在地的時(shí)區(qū)。我們要特別注意,城市名稱并不是任意的城市,而是由國(guó)際標(biāo)準(zhǔn)組織規(guī)定的城市。
4. 本地化
本地化并不只包括時(shí)間這一種信息,還包括一個(gè)國(guó)家或地區(qū)所采用的日期、時(shí)間、數(shù)字、貨幣等各種信息的格式,開(kāi)發(fā)時(shí)通常使用Locale進(jìn)行表示。Locale由“語(yǔ)言_國(guó)家”的字母縮寫(xiě)構(gòu)成,如“zh_CN”就表示“中文+中國(guó)”,“en_US”表示“英文+美國(guó)”。其中語(yǔ)言是小寫(xiě),國(guó)家是大寫(xiě)。
而對(duì)于不同國(guó)家或地區(qū)的Locale日期部分來(lái)說(shuō),如中國(guó)和美國(guó)的本地時(shí)間表示方式如下:
- zh_CN:2023-01-24
- en_US:01/24/2023
5. 夏令時(shí)
夏令時(shí)(Daylight Saving Time:DST),也叫夏時(shí)制,又稱“日光節(jié)約時(shí)制”,是一種為了節(jié)約能源而人為規(guī)定地方時(shí)間的制度。一般在天亮早的夏季人為將時(shí)間調(diào)快一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。
我們國(guó)家曾經(jīng)實(shí)行過(guò)一段時(shí)間夏令時(shí),但在1992年就廢除了,不過(guò)美國(guó)人到現(xiàn)在還在使用。所以涉及到跨國(guó)應(yīng)用開(kāi)發(fā)時(shí),相關(guān)時(shí)間的換算可能會(huì)有點(diǎn)復(fù)雜。因?yàn)樯婕暗较牧顣r(shí),相同的時(shí)區(qū),如果表示的方式不同,轉(zhuǎn)換出的時(shí)間也是不同的。
6. Epoch Time時(shí)間起點(diǎn)
Epoch Time是一個(gè)固定的通用時(shí)間,即世界標(biāo)準(zhǔn)時(shí)間(UTC) 1970-01-01 00:00:00 UTC,它是計(jì)算機(jī)里時(shí)間開(kāi)始的起點(diǎn),該起點(diǎn)被記為0,而1970年以前的時(shí)間被認(rèn)為是負(fù)數(shù)。我們知道,現(xiàn)實(shí)世界的時(shí)間誰(shuí)也不知道是從什么時(shí)候開(kāi)始的,但是計(jì)算機(jī)發(fā)明的時(shí)間并不長(zhǎng),為了方便大家進(jìn)行各種開(kāi)發(fā)和計(jì)算,于是國(guó)際標(biāo)準(zhǔn)委員會(huì)就給計(jì)算機(jī)設(shè)置了一個(gè)時(shí)間的起點(diǎn)。以這個(gè)時(shí)間為起點(diǎn),每過(guò)去一秒,該數(shù)值就加1,這樣我們就可以算出對(duì)應(yīng)的公歷時(shí)間日期(不包括閏秒)。 Epoch Time在不同的編程語(yǔ)言中,會(huì)有幾種不同的存儲(chǔ)方式:
- 以秒為單位的整數(shù):1574208900,缺點(diǎn)是精度只能到秒;
- 以毫秒為單位的整數(shù):1574208900123,最后3位表示毫秒數(shù);
- 以秒為單位的浮點(diǎn)數(shù):1574208900.123,小數(shù)點(diǎn)后表示零點(diǎn)幾秒。
7. 時(shí)間戳
時(shí)間戳(timestamp),也稱為Unix時(shí)間 或 POSIX時(shí)間,它是一種時(shí)間表示方式。表示從1970年1月1日0時(shí)0分0秒(格林尼治時(shí)間)開(kāi)始,一直到現(xiàn)在所經(jīng)過(guò)的秒數(shù)或毫秒數(shù)。在Java一般是用long類型來(lái)存儲(chǔ)該值,但在別的編程語(yǔ)言中有可能是使用float類型。 比如1574208900就表示從1970年1月1日零點(diǎn)開(kāi)始,到2019年11月20日8點(diǎn)15分截止,一共經(jīng)歷了1574208900秒,所以換算成北京時(shí)間就是:1574208900 = 北京時(shí)間2019-11-20 8:15:00。如果我們要獲取當(dāng)前的時(shí)間戳,在Java中可以使用System.currentTimeMillis()方法。
從本質(zhì)上來(lái)說(shuō),時(shí)間戳就是個(gè)時(shí)間差值,其值與時(shí)區(qū)無(wú)關(guān)。比如在UTC標(biāo)準(zhǔn)下,時(shí)間起點(diǎn)的時(shí)間戳就是timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
,此時(shí)對(duì)應(yīng)的北京時(shí)間是timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
了解了以上這些基本概念之后,我們就可以繼續(xù)往下學(xué)習(xí)今天其他的內(nèi)容了。
二. Date日期時(shí)間類
1. 簡(jiǎn)介
如果我們想在Java中獲取當(dāng)前的時(shí)間,可以使用 java.util.Date類 和 java.util.Calendar類來(lái)實(shí)現(xiàn)。其中,Date類封裝了系統(tǒng)的日期和時(shí)間信息,Calendar類則會(huì)根據(jù)系統(tǒng)的日歷來(lái)填充Date對(duì)象。
java.util.Date是一個(gè)表示日期和時(shí)間的類,代表了系統(tǒng)特定的時(shí)間戳。它是按照UTC時(shí)間顯示的,可以精確到毫秒,源碼內(nèi)部使用long類型進(jìn)行時(shí)間的存儲(chǔ)。我們要注意與java.sql.Date區(qū)分,后者是用在數(shù)據(jù)庫(kù)中的類,且是按照本地時(shí)區(qū)顯示的。Date對(duì)象表示的時(shí)間,其默認(rèn)順序是星期、月、日、小時(shí)、分、秒、年。
2. 構(gòu)造方法
java.util.Date類給我們提供了多個(gè)構(gòu)造方法,如下圖所示:
但是一般在開(kāi)發(fā)時(shí),我們常用的也沒(méi)有這么多,一般使用時(shí)如下形式:
- Date():創(chuàng)建Date對(duì)象并初始化,該對(duì)象可以獲取本地的當(dāng)前時(shí)間,該時(shí)間會(huì)精確到毫秒。
- Date(long date):構(gòu)造一個(gè)Date對(duì)象,并接受一個(gè)從1970年1月1日起的毫秒數(shù)作為參數(shù)。
3. 常用API方法
當(dāng)我們構(gòu)造出來(lái)一個(gè)Date對(duì)象之后,就可以使用它的一些API方法進(jìn)行時(shí)間的操作了,這些常用的API方法如下:
序號(hào) | 方法和描述 |
---|---|
boolean after(Date date) | 若調(diào)用該方法的Date對(duì)象,在指定的日期之后,則返回true,否則返回false。 |
boolean before(Date date) | 若調(diào)用此方法的Date對(duì)象,在指定的日期之前,則返回true,否則返回false |
int compareTo(Date date) | 比較調(diào)用此方法的Date對(duì)象和指定的日期。若兩者相等則返回0,若該對(duì)象在指定日期之前則返回負(fù)數(shù),若該對(duì)象在指定日期之后則返回正數(shù)。 |
boolean equals(Object date) | 若調(diào)用該方法的Date對(duì)象,和指定日期相等時(shí)則返回true,否則返回false。 |
long getTime( ) | 返回自1970年1月1日 00:00:00 GMT以來(lái)的毫秒數(shù)。 |
void setTime(long time) | 用從1970年1月1日00:00:00 以后的time毫秒數(shù),設(shè)置時(shí)間和日期。 |
String toString( ) | 把該Date對(duì)象轉(zhuǎn)換成dow mon dd hh:mm:ss zzz yyyy格式的字符串,其中dow是指一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
4. 使用方法
4.1 基本使用
接下來(lái)我們先通過(guò)一個(gè)簡(jiǎn)單的案例,來(lái)演示一下Date的基本用法。
import java.util.Date; /** * @author */ public class Demo01 { public static void main(String[] args) { //獲取當(dāng)前時(shí)間的時(shí)間戳 long currentTimeMillis = System.currentTimeMillis(); System.out.println("時(shí)間戳="+currentTimeMillis); //獲取當(dāng)前時(shí)間對(duì)象 Date date=new Date(); //Sat Feb 11 12:04:03 IRKT 2023 System.out.println("當(dāng)前時(shí)間="+date); //轉(zhuǎn)為字符串:Sat Feb 11 12:04:03 IRKT 2023 System.out.println("當(dāng)前時(shí)間="+date.toString()); //轉(zhuǎn)換為本地時(shí)區(qū):2023年2月11日 下午12:04:03 System.out.println("當(dāng)前時(shí)間,Locale="+date.toLocaleString()); //轉(zhuǎn)換為GMT時(shí)區(qū):11 Feb 2023 04:04:03 GMT System.out.println("當(dāng)前時(shí)間,GMT="+date.toGMTString()); } }
如果我們想獲取當(dāng)前時(shí)間的時(shí)間戳,可以使用System.currentTimeMillis()方法。構(gòu)造出Date對(duì)象之后,我們可以直接打印該對(duì)象,就能展示出當(dāng)前時(shí)間,但是這個(gè)格式并不一定符合我們中國(guó)人的閱讀習(xí)慣,后面我們可以對(duì)日期進(jìn)行格式化操作。
4.2 其他用法
除了上面這些基本用法之外,Date還有其他的一些用法。
import java.util.Date; /** * @author */ public class Demo01 { public static void main(String[] args) { //獲取當(dāng)前時(shí)間對(duì)象 Date date=new Date(); //獲取年月日 System.out.println("年="+(date.getYear() + 1900)); // 必須加上1900 System.out.println("月="+(date.getMonth() + 1)); // 0~11,必須加上1 System.out.println("日="+date.getDate()); // 1~31,不能加1 System.out.println("時(shí)="+date.getHours()); // 0~23 System.out.println("分="+date.getMinutes()); // 0~59,不能加1 System.out.println("秒="+date.getSeconds()); // 0~59,不能加1 System.out.println("時(shí)間戳="+date.getTime()); // 時(shí)間戳,毫秒值 //計(jì)算自己已經(jīng)活了多少天,1990年01月31日 //構(gòu)造對(duì)象的另一個(gè)方法,已過(guò)時(shí)。year:要減去1900,月份從0開(kāi)始,0-11;日期是1-31 Date d1 = new Date(1990-1900, 2-1, 31); Date d2 = new Date(); long time = d2.getTime() - d1.getTime(); System.out.println("已活天數(shù)="+time/1000/60/60/24); } }
另外我們還要注意,getYear()方法返回的年份必須加上1900;getMonth()方法返回的月份是011,分別表示112月,所以要加1;而getDate()方法返回的日期范圍是1~31,就不能加1。
在打印本地時(shí)區(qū)表示的日期和時(shí)間時(shí),不同的計(jì)算機(jī)可能會(huì)有不同的展示結(jié)果,后面我們可以使用SimpleDateFormat設(shè)置出我們想要的日期時(shí)間格式。
4.3 統(tǒng)計(jì)時(shí)間差
有時(shí)候我們要統(tǒng)計(jì)某個(gè)功能的執(zhí)行時(shí)間,此時(shí)就可以用該功能結(jié)束時(shí)的時(shí)間,減去開(kāi)始時(shí)的時(shí)間,得到一個(gè)時(shí)間差,這就是該功能的執(zhí)行時(shí)間。
import java.util.Date; /** * @author */ public class Demo03 { public static void main(String[] args) { //獲取當(dāng)前時(shí)間對(duì)象 //開(kāi)始時(shí)間 Date startDate=new Date(); for(int i=0;i<100000;i++) { System.out.println("循環(huán)次數(shù)"+i); } //結(jié)束時(shí)間 Date endDate=new Date(); //計(jì)算時(shí)間差 long time = endDate.getTime() - startDate.getTime(); System.out.println("10w次循環(huán)的執(zhí)行時(shí)間是 "+time+" 毫秒"); } }
三. Calendar日歷類
1. 簡(jiǎn)介
Calendar類是Java時(shí)間類Date的擴(kuò)展。相比Date,它擁有更強(qiáng)大的功能,主要是多了可以做簡(jiǎn)單日期和時(shí)間運(yùn)算的功能,且在實(shí)現(xiàn)方式上也比Date類更復(fù)雜一些。Calendar可以用來(lái)計(jì)算日期,比如說(shuō)計(jì)算下個(gè)月的日期,或者兩個(gè)月前的日期等。
Calendar類是一個(gè)抽象類,我們?cè)趯?shí)際使用時(shí)需要實(shí)現(xiàn)特定的子類,一般使用getInstance()方法創(chuàng)建即可。Calendar類有幾個(gè)主要的子類,包括java.util.GregorianCalendar和java.util.TimeZone。其中GregorianCalendar類提供了標(biāo)準(zhǔn)的日歷系統(tǒng),可以用來(lái)計(jì)算未來(lái)或過(guò)去某天的日期。TimeZone類則可以用來(lái)在不同的時(shí)區(qū)之間,轉(zhuǎn)換日期和時(shí)間。
2. Calendar常量字段
Calendar中有以下幾個(gè)常用的常量字段,用于表示不同的意義。
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意義完全相同 |
Calendar.HOUR | 12小時(shí)制的小時(shí) |
Calendar.HOUR_OF_DAY | 24小時(shí)制的小時(shí) |
Calendar.MINUTE | 分鐘 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期幾 |
3. Calendar常用方法
除了以上常用的常量字段之外,Calendar還有一些常用的方法,如下表所示:
方法 | 描述 |
---|---|
void add(int field, int amount) | 根據(jù)日歷的規(guī)則,為給定的日歷字段 field 添加或減去指定的時(shí)間量 amount |
boolean after(Object when) | 判斷此 Calendar 表示的時(shí)間是否在指定時(shí)間 when 之后,并返回判斷結(jié)果 |
boolean before(Object when) | 判斷此 Calendar 表示的時(shí)間是否在指定時(shí)間 when 之前,并返回判斷結(jié)果 |
void clear() | 清空 Calendar 中的日期時(shí)間值 |
int compareTo(Calendar anotherCalendar) | 比較兩個(gè) Calendar 對(duì)象表示的時(shí)間值(從格林威治時(shí)間 1970 年 01 月 01 日 00 時(shí) 00 分 00 秒至現(xiàn)在的毫秒偏移量),大則返回 1,小則返回 -1,相等返回 0 |
int get(int field) | 返回指定日歷字段的值 |
int getActualMaximum(int field) | 返回指定日歷字段可能擁有的最大值 |
int getActualMinimum(int field) | 返回指定日歷字段可能擁有的最小值 |
int getFirstDayOfWeek() | 獲取一星期的第一天。根據(jù)不同的國(guó)家地區(qū),返回不同的值 |
static Calendar getInstance() | 使用默認(rèn)時(shí)區(qū)和語(yǔ)言壞境獲得一個(gè)日歷 |
static Calendar getInstance(TimeZone zone) | 使用指定時(shí)區(qū)和默認(rèn)語(yǔ)言環(huán)境獲得一個(gè)日歷 |
static Calendar getInstance(TimeZone zone,Locale aLocale) | 使用指定時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷 |
Date getTime() | 返回一個(gè)表示此 Calendar 時(shí)間值(從格林威治時(shí)間1970 年 01 月 01 日 00 時(shí) 00 分 00 秒至現(xiàn)在的毫秒偏移量)的 Date 對(duì)象 |
long getTimeInMillis() | 返回此 Calendar 的時(shí)間值,以毫秒為單位 |
void set(int field, int value) | 為指定的日歷字段設(shè)置給定值 |
void set(int year, int month, int date) | 設(shè)置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void set(int year, int month, int date, int hourOfDay,int minute, int second) | 設(shè)置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值 |
void setFirstDayOfWeek(int value) | 設(shè)置一星期的第一天是哪一天 |
void setTimeInMillis(long millis) | 用給定的 long 值設(shè)置此 Calendar 的當(dāng)前時(shí)間值 |
Calendar對(duì)象可以調(diào)用set()方法將日歷翻到任何一個(gè)時(shí)間,當(dāng)參數(shù) year取負(fù)數(shù)時(shí)表示是公元前。調(diào)用 get()方法可以獲取年、月、日等時(shí)間信息,field參數(shù)的值是前面講過(guò)的Calendar靜態(tài)常量。
4. 構(gòu)建Calendar對(duì)象
Calendar類是抽象類,所以我們不能通過(guò)new的方式來(lái)構(gòu)建Calendar對(duì)象。在實(shí)際使用時(shí),我們一般是要實(shí)現(xiàn)特定的子類,經(jīng)常是使用getInstance()方法進(jìn)行創(chuàng)建。
import java.util.Calendar; /** * @author */ public class Demo04 { public static void main(String[] args) { //默認(rèn)是當(dāng)前日期 Calendar c1 = Calendar.getInstance(); System.out.println("c1="+c1); //創(chuàng)建一個(gè)代表2023年2月2日的Calendar對(duì)象 Calendar c2 = Calendar.getInstance(); c2.set(2023, 2-1, 2); System.out.println("c2="+c2); } }
5. 獲取當(dāng)前時(shí)間
獲取到Calendar對(duì)象之后,我們可以獲取到當(dāng)前日期對(duì)象的年月日時(shí)分秒等信息。
import java.util.Calendar; /** * @author */ public class Demo05 { public static void main(String[] args) { // 獲取當(dāng)前時(shí)間 Calendar c = Calendar.getInstance(); int y = c.get(Calendar.YEAR); //月份要加1 int m = 1 + c.get(Calendar.MONTH); int d = c.get(Calendar.DAY_OF_MONTH); int w = c.get(Calendar.DAY_OF_WEEK); int hh = c.get(Calendar.HOUR_OF_DAY); int mm = c.get(Calendar.MINUTE); int ss = c.get(Calendar.SECOND); int ms = c.get(Calendar.MILLISECOND); //2023-2-11 7 18:10:59.847 System.out.println(y + "-" + m + "-" + d + " " + w + " " + hh + ":" + mm + ":" + ss + "." + ms); } }
我們要注意,Calendar是通過(guò)get()方法獲取年月日等信息的,其中返回的年份不必轉(zhuǎn)換,返回的月份仍要加1,返回的星期要特別注意,1~7分別表示周日、周一、……周六。
6. 設(shè)置時(shí)間
我們通過(guò)Calendar.getInstance()方法獲取到Calendar對(duì)象后,獲取到的其實(shí)就是當(dāng)前時(shí)間。如果我們想設(shè)置某個(gè)特定的日期和時(shí)間,需要先用clear()方法清除掉之前所有的字段。
import java.util.Calendar; /** * @author */ public class Demo06 { public static void main(String[] args) { // 設(shè)置時(shí)間 Calendar c = Calendar.getInstance(); // 清除所有 c.clear(); // 設(shè)置2023年 c.set(Calendar.YEAR, 2023); // 設(shè)置2月(0~11) c.set(Calendar.MONTH, 1); // 設(shè)置2日 c.set(Calendar.DATE, 2); // 設(shè)置時(shí)間 c.set(Calendar.HOUR_OF_DAY, 21); c.set(Calendar.MINUTE, 22); c.set(Calendar.SECOND, 23); //Thu Feb 02 21:22:23 IRKT 2023 System.out.println("date="+c.getTime()); } }
我們可以利用Calendar.getTime()方法,將一個(gè)Calendar對(duì)象轉(zhuǎn)換成Date對(duì)象,后面我們就可以用SimpleDateFormat進(jìn)行格式化操作了。
四. GregorianCalendar類
1. 簡(jiǎn)介
Java中除了有Calendar類實(shí)現(xiàn)了公歷日歷,還有一個(gè)子類GregorianCalendar。在GregorianCalendar類中,定義了兩個(gè)字段:AD和BC,分別代表公歷定義的兩個(gè)時(shí)代。GregorianCalendar中的屬性和方法與Calendar類似,就不再贅述了,接下來(lái)我們直接通過(guò)一個(gè)案例來(lái)進(jìn)行展示其用法。
2. 基本用法
這里我們?cè)O(shè)計(jì)一個(gè)案例,來(lái)判斷當(dāng)前年份是閏年還是平年。
import java.util.Calendar; import java.util.GregorianCalendar; /** * @author */ public class Demo05 { public static void main(String[] args) { //定義一個(gè)月份數(shù)組 String months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int year; // 使用當(dāng)前時(shí)間和日期,初始化Gregorian日歷對(duì)象,默認(rèn)為本地時(shí)間和時(shí)區(qū) GregorianCalendar gcalendar = new GregorianCalendar(); // 顯示當(dāng)前時(shí)間和日期的信息 System.out.print("Date:"); System.out.print(months[gcalendar.get(Calendar.MONTH)]); System.out.print(" " + gcalendar.get(Calendar.DATE) + " "); System.out.println(year = gcalendar.get(Calendar.YEAR)); System.out.print("Time:"); System.out.print(gcalendar.get(Calendar.HOUR) + ":"); System.out.print(gcalendar.get(Calendar.MINUTE) + ":"); System.out.println(gcalendar.get(Calendar.SECOND)); //判斷當(dāng)前年份是否為閏年 if (gcalendar.isLeapYear(year)) { System.out.println("當(dāng)前年份是閏年"); } else { System.out.println("當(dāng)前年份是平年"); } } }
五. 結(jié)語(yǔ)
至此,就把Date和擴(kuò)展類Calendar給大家講解完畢,今天的內(nèi)容其實(shí)并不難,大家需要把一些常用的構(gòu)造方式及方法、常量記一下即可。
以上就是一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類的詳細(xì)內(nèi)容,更多關(guān)于Java 日期時(shí)間相關(guān)類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
由淺到深帶你詳談Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式
這篇文章主要詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式,新建一個(gè)數(shù)組,把原來(lái)數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價(jià)值,需要的朋友可以借鑒一下2023-06-06使用MyBatisPlus自動(dòng)生成代碼后tomcat運(yùn)行報(bào)錯(cuò)的問(wèn)題及解決方法
這篇文章主要介紹了使用MyBatisPlus自動(dòng)生成代碼后tomcat運(yùn)行報(bào)錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java異步線程中的CompletableFuture與@Async詳解
這篇文章主要介紹了Java異步線程中的CompletableFuture與@Async詳解,CompletableFuture是java中提供的一個(gè)異步執(zhí)行類,@Async是Spring提供的異步執(zhí)行方法,當(dāng)調(diào)用方法單獨(dú)開(kāi)啟一個(gè)線程進(jìn)行調(diào)用,需要的朋友可以參考下2024-01-01利用feign調(diào)用返回object類型轉(zhuǎn)換成實(shí)體
這篇文章主要介紹了利用feign調(diào)用返回object類型轉(zhuǎn)換成實(shí)體,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java.sql.SQLException問(wèn)題解決以及注意事項(xiàng)
這篇文章主要給大家介紹了關(guān)于java.sql.SQLException問(wèn)題解決以及注意事項(xiàng)的相關(guān)資料,這個(gè)問(wèn)題其實(shí)很好解決,文中通過(guò)圖文將解決的辦法介紹的很詳細(xì),需要的朋友可以參考下2023-07-07java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
對(duì)靜態(tài)代碼塊以及構(gòu)造函數(shù)的執(zhí)行先后順序,一直很迷惑,直到最近看到一段代碼,發(fā)現(xiàn)終于弄懂了,所以這篇文章主要給大家介紹了關(guān)于如何判斷java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下。2017-12-12SpringBoot參數(shù)校驗(yàn)之@Valid的使用詳解
這篇文章主要通過(guò)示例為大家詳細(xì)介紹一下介紹了SpringBoot參數(shù)校驗(yàn)中@Valid的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06Java數(shù)據(jù)結(jié)構(gòu)之線段樹(shù)中的懶操作詳解
對(duì)于線段樹(shù),若要求對(duì)區(qū)間中的所有點(diǎn)都進(jìn)行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過(guò)一個(gè)示例和大家詳細(xì)聊聊線段樹(shù)中的懶操作,需要的可以參考一下2022-10-10