本篇文章主要摘錄了4篇文章的內(nèi)容毯炮,原文在文末
在java中時(shí)間類(lèi)主要有Date逼肯、Calendar、SimpleDateFormat
桃煎,暫時(shí)只介紹 java.util.*
下的時(shí)間類(lèi)篮幢,對(duì)于java.sql.下的先不做介紹,文章比較長(zhǎng)可以根據(jù)自己的需要看對(duì)應(yīng)的內(nèi)容为迈。
目錄:
一三椿、Date類(lèi)
1.使用Date類(lèi)代表當(dāng)前系統(tǒng)時(shí)間
2.使用Date類(lèi)代表指定時(shí)間
3.獲取Date對(duì)象中的信息(年月日周)
二、Calendar類(lèi)
1.使用Calendar類(lèi)代表當(dāng)前時(shí)間
2.使用Calendar類(lèi)代表指定的時(shí)間
1)指定日期中,年月日
2)指定日期年月日葫辐,中某個(gè)日期
3.Calendar類(lèi)常用方法
案例:
三搜锰、SimpleDateFormat類(lèi)
1.String 類(lèi)型轉(zhuǎn)化成Date
2.Date類(lèi)型轉(zhuǎn)化成為String
3.其它日期格式
四、后記
一耿战、Date類(lèi)
在JDK1.0中蛋叼,Date類(lèi)是唯一的一個(gè)代表時(shí)間的類(lèi),但是由于Date類(lèi)不便于實(shí)現(xiàn)國(guó)際化剂陡,所以從JDK1.1版本開(kāi)始鸦列,推薦使用Calendar類(lèi)進(jìn)行時(shí)間和日期處理租冠。這里簡(jiǎn)單介紹一下Date類(lèi)的使用鹏倘。
Date
類(lèi)中很多方法已經(jīng)過(guò)時(shí)薯嗤,使用Calendar
來(lái)替代。
常用方法有纤泵,
long getTime() //返回的時(shí)間是距離1970年的毫秒數(shù)
void setTime(long time)
1.使用Date類(lèi)代表當(dāng)前系統(tǒng)時(shí)間
//創(chuàng)建一個(gè)代表系統(tǒng)當(dāng)前日期的Date對(duì)象
Date now = new Date();
System.out.println(date);
//Wed Dec 29 15:38:51 CST 2021
使用Date類(lèi)的默認(rèn)構(gòu)造方法創(chuàng)建出來(lái)的對(duì)象就代表當(dāng)前的時(shí)間骆姐,由于Date類(lèi)覆蓋了toString()方法。所以可以直接輸出Date類(lèi)型的對(duì)象捏题,顯示的結(jié)果如下:Wed Dec 29 15:38:51 CST 2021
2.使用Date類(lèi)代表指定時(shí)間
使用帶參數(shù)的構(gòu)造方法 Date(int year, int month, int day)
玻褪,可以構(gòu)造指定日期
的Date類(lèi)對(duì)象,Date類(lèi)中年份的參數(shù)應(yīng)該是實(shí)際需要代表的年份減去
1900公荧,月份參數(shù)應(yīng)該是實(shí)際需要代表的月份減去1
以后的值带射。
//創(chuàng)建一個(gè)代表2021年6月12號(hào)的Date對(duì)象
Date d1 = new Date(2021-1900, 6-1, 12);
3.獲取Date對(duì)象中的信息(年月日周)
如:
Date d2 = new Date(2014-1900, 6-1, 12);
//獲得年份 (注意年份要加上1900,這樣才是日期對(duì)象d2所代表的年份)
int year = d2.getYear() + 1900;
//獲得月份 (注意月份要加1循狰,這樣才是日期對(duì)象d2所代表的月份)
int month = d2.getMonth() + 1;
//獲得日期
int date = d2.getDate();
//獲得小時(shí)
int hour = d2.getHours();//不設(shè)置默認(rèn)為0
//獲得分鐘
int minute = d2.getMinutes();
//獲得秒
int second = d2.getSeconds();
//獲得星期 (注意:0代表星期日窟社、1代表星期1、2代表星期2绪钥,其他的一次類(lèi)推了)
int day = d2.getDay();
使用Date類(lèi)中的get
方法灿里。需要注意的是使用getYear
獲得的是Date對(duì)象中年份減去1900以后的值,所以需要顯示對(duì)應(yīng)的年份則需要在返回值的基礎(chǔ)上加1900程腹,月份類(lèi)似匣吊。在Date類(lèi)中還提供了getDay
方法,用于獲得Date對(duì)象代表的時(shí)間是星期幾寸潦,Date
類(lèi)規(guī)定周日是0色鸳,周一是1,周二是2见转,后續(xù)的依次類(lèi)推命雀。
二、Calendar類(lèi)
從JDK1.1版本開(kāi)始池户,在處理日期和時(shí)間時(shí)咏雌,系統(tǒng)推薦使用Calendar類(lèi)進(jìn)行實(shí)現(xiàn)(Date的一些方法都過(guò)時(shí)了)。在設(shè)計(jì)上校焦,Calendar類(lèi)的功能要比Date類(lèi)強(qiáng)大很多赊抖,而且在實(shí)現(xiàn)方式上也比Date類(lèi)要復(fù)雜一些,下面就介紹一下Calendar類(lèi)的使用寨典。
Calender類(lèi)是一個(gè)抽象類(lèi)氛雪,在實(shí)際使用時(shí)實(shí)現(xiàn)特定的子類(lèi)的對(duì)象,使用getInstance()
方法創(chuàng)建即可耸成。
1.使用Calendar類(lèi)代表當(dāng)前時(shí)間
Calendar c = Calendar.getInstance();
System.out.println(c);
//結(jié)果:
//java.util.GregorianCalendar[time=1640766764310,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=363,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=32,SECOND=44,MILLISECOND=310,ZONE_OFFSET=28800000,DST_OFFSET=0]
返回的是一個(gè)Calendar對(duì)象,由于Calendar類(lèi)是抽象類(lèi)报亩,且Calendar類(lèi)的構(gòu)造方法是protected的浴鸿,所以無(wú)法使用Calendar類(lèi)的構(gòu)造方法來(lái)創(chuàng)建對(duì)象,API中提供了getInstance方法用來(lái)創(chuàng)建對(duì)象弦追。
使用該方法獲得的Calendar對(duì)象就代表當(dāng)前的系統(tǒng)時(shí)間岳链,由于Calendar類(lèi)toString實(shí)現(xiàn)的沒(méi)有Date類(lèi)那么直觀(guān),所以直接輸出Calendar類(lèi)的對(duì)象意義不大劲件。
2.使用Calendar類(lèi)代表指定的時(shí)間
1)指定日期中,年月日
//獲取獲取系統(tǒng)的當(dāng)前日歷對(duì)象
Calendar c1 = Calendar.getInstance();
c1.set(2021,8-1,28);
使用過(guò)Calendar類(lèi)代表特定的時(shí)間掸哑,需要首先創(chuàng)建一個(gè)Calendar的對(duì)象,然后在設(shè)定該對(duì)象中的年月日參數(shù)來(lái)完成零远。set方法的聲明為:public final void set(int year,int month,int date)
以上示例代碼設(shè)置的時(shí)間為2021年8月28日
苗分,其參數(shù)的結(jié)構(gòu)和Date類(lèi)不一樣。Calendar類(lèi)中年份的數(shù)值直接書(shū)寫(xiě)牵辣,月份的值為實(shí)際的月份值減1
摔癣,日期的值就是實(shí)際的日期值。
備注:看見(jiàn)另外一種方法指定日期:
Calendar current = Calendar.getInstance();
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//將時(shí)間對(duì)象data設(shè)置為新的日歷
System.out.println("修改后的系統(tǒng)時(shí)間為:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));
2)指定日期年月日纬向,中某個(gè)日期
如果只設(shè)定某個(gè)字段某個(gè)字段择浊,例如日期的值,則可以使用如下set方法:
public void set(int field,int value)
,在該方法中罢猪,參數(shù)field代表要設(shè)置的字段的類(lèi)型近她,常見(jiàn)類(lèi)型如下:
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份; |
Calendar.DATE | 日期;當(dāng)月的第幾天 |
Calendar.DAY_OF_MONTH | 日期膳帕,和Calendar.DATE字段完全相同粘捎; |
Calendar.HOUR | 12小時(shí)制的小時(shí)數(shù); |
Calendar.HOUR_OF_DAY | 24小時(shí)制的小時(shí)數(shù)危彩; |
Calendar.MINUTE | 分鐘攒磨; |
Calendar.SECOND | 秒; |
Calendar.DAY_OF_WEEK | 星期幾汤徽。 |
Calendar c1 = Calendar.getInstance();
System.out.println(c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//2021-11-29
c1.set(Calendar.DATE,10);
System.out.println("日期設(shè)置為10號(hào)后:" + c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//日期設(shè)置為10號(hào)后:2021-11-10
該代碼的作用是將c1對(duì)象代表的時(shí)間中日期設(shè)置為10號(hào)娩缰,其它所有的數(shù)值會(huì)被重新計(jì)算,例如星期幾以及對(duì)應(yīng)的相對(duì)時(shí)間數(shù)值等谒府。
3.Calendar類(lèi)常用方法
方法 | 作用 |
---|---|
static Calendar getInstance() | 使用默認(rèn)時(shí)區(qū)和區(qū)域設(shè)置獲取日歷拼坎。通過(guò)該方法生成Calendar對(duì)象。如下所示:Calendar cr=Calendar.getInstance()完疫;
|
public void set(int year,int month,int date,int hourofday,int minute,int second) | 設(shè)置日歷的年泰鸡、月、日壳鹤、時(shí)盛龄、分、秒。 |
public int get(int field) | 返回給定日歷字段的值余舶。所謂字段就是年啊鸭、月、日等等匿值。 |
public void setTime(Date date) | 使用給定的Date設(shè)置此日歷的時(shí)間赠制。Date------Calendar,重新設(shè)置時(shí)間
|
public Date getTime() | 返回一個(gè)Date表示此日歷的時(shí)間千扔。Calendar-----Date憎妙,格式:Sat Sep 08 10:10:10 CST 2012,返回一個(gè)Date時(shí)間
|
abstract void add(int field,int amount) | 該方法的作用是在Calendar對(duì)象中的某個(gè)字段上增加或減少一定的數(shù)值曲楚,增加是amount的值為正,減少是amount的值為負(fù)褥符。如下所示:Calendar c3 = Calendar.getInstance();c3.add(Calendar.DATE,100);--計(jì)算100天以后的時(shí)間
|
public long getTimeInMillis() | 以毫秒為單位返回該日歷的時(shí)間值龙誊。返回毫秒值 |
案例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class test {
public static void main(String[] args) throws ParseException {
//獲 取獲取系統(tǒng)的當(dāng)前日歷對(duì)象
Calendar current = Calendar.getInstance();
//1、獲取今天是周幾,在Calendar類(lèi)中喷楣,周日是1趟大,周一是2,周二是3铣焊,依次類(lèi)推逊朽。
int weekDay = current.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是周:" + (weekDay - 1));
//2、獲取系統(tǒng)當(dāng)前年
int year = current.get(Calendar.YEAR);
System.out.println("今年是:" + year + "年");
//3曲伊、獲取系統(tǒng)當(dāng)前月
int month = current.get(Calendar.MONTH);
System.out.println("本月是:" + (month + 1) + "月");
//4叽讳、獲取系統(tǒng)當(dāng)前日
int day = current.get(Calendar.DATE);
System.out.println("今天是" + day + "號(hào)");
//5、獲取上午跟下午
int am_pm = current.get(Calendar.AM_PM);
if (am_pm == 0)
System.out.println("是上午");
else
System.out.println("是下午");
//6坟募、獲取當(dāng)前的系統(tǒng)時(shí)間[date-->String]的過(guò)程
Date time = current.getTime();//獲取的是當(dāng)前系統(tǒng)的時(shí)間,Wed Dec 29 17:20:51 CST 2021
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String showTime = format.format(time);
System.out.println("當(dāng)前系統(tǒng)時(shí)間為:" + showTime);
//7岛蚤、自定義日歷的時(shí)間
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//將時(shí)間對(duì)象data設(shè)置為新的日歷
System.out.println("修改后的系統(tǒng)時(shí)間為:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));
}
}
在Calendar類(lèi)中,周日是1懈糯,周一是2涤妒,周二是3,依次類(lèi)推赚哗。
三她紫、SimpleDateFormat類(lèi)
SimpleDateFormat類(lèi)可以實(shí)現(xiàn)java中日期格式的轉(zhuǎn)化,將String類(lèi)型的時(shí)間格式轉(zhuǎn)化成Date類(lèi)型或者將Date類(lèi)型時(shí)間轉(zhuǎn)化成為String類(lèi)型
1.String 類(lèi)型轉(zhuǎn)化成Date
try {
String startTime = "2021-12-29";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse(startTime);
System.out.println(start);
//getTime():返回的時(shí)間是距離1970年的毫秒數(shù).值不受setTime()的影響
System.out.println(start.getTime());
}catch (ParseException e){
e.printStackTrace();
}
- 這里要注意屿储,傳遞進(jìn)來(lái)的
startTime
是String類(lèi)型的字符串贿讹,其格式必須和SimpleDateFormate
里面的參數(shù)形式一直,不是何格式的字符串都可以轉(zhuǎn)化扩所,要不會(huì)出現(xiàn)轉(zhuǎn)發(fā)異常围详。 -
SimpDateFormat的parse()
方法,可能拋出ParseException
異常,需要異常處理
2.Date類(lèi)型轉(zhuǎn)化成為String
//獲取系統(tǒng)當(dāng)前時(shí)間
Date now=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(now)); //2021/12/29 15:12
3.其它日期格式
SimpleDateFormat sdf0 =new SimpleDateFormat("Gyyyy年MM月dd日 HH時(shí)mm分ss秒");
//公元2021年12月29日 15時(shí)13分32秒
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
//2021/12/29 15:13
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2021-12-29 15:13:32
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒 E ");
//2021年12月29日 15時(shí)13分32秒 星期三
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy/MM/dd E");
//2021/12/29 星期三
SimpleDateFormat sdf5 = new SimpleDateFormat("一年中的第 D 天 助赞,第w個(gè)星期 买羞,一個(gè)月中第W個(gè)星期 ,k時(shí) z時(shí)區(qū)");
//一年中的第 363 天 雹食,第1個(gè)星期 畜普,一個(gè)月中第5個(gè)星期 ,15時(shí) CST時(shí)區(qū)
SimpleDateFormat
日期-時(shí)間格式模式參數(shù)::
字母 | 對(duì)應(yīng)日期或時(shí)間元素 | 表示 | 示例 |
---|---|---|---|
G | 年代標(biāo)志符 | 標(biāo)志符 | Text AD |
y | 年 | Year | 1996; 96 |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周數(shù) | Number | 27 |
W | 月份中的周數(shù) | Number | 2 |
D | 年中的天數(shù) | Number | 189 |
d | 月份中的天數(shù) | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天數(shù) | Text | Tuesday; Tue |
a | Am/pm 標(biāo)記 | Text | PM |
H | 一天中的小時(shí)數(shù)(0-23) | Number | 0 |
k | 一天中的小時(shí)數(shù)(1-24) | Number | 24 |
K | am/pm 中的小時(shí)數(shù)(0-11) | Number | 0 |
h | am/pm 中的小時(shí)數(shù)(1-12) | Number | 12 |
m | 小時(shí)中的分鐘數(shù) | Number | 30 |
s | 分鐘中的秒數(shù) | Number | 55 |
S | 毫秒數(shù) | Number | 978 |
z | 時(shí)區(qū) | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 時(shí)區(qū) | RFC 822 time zone | -0800 |
四群叶、后記
最后:案例這里就不介紹了呀吃挑,上面的三個(gè)類(lèi)Date、SimpleDateFormat街立、Calendar
理解到了舶衬,可以根據(jù)百度如何實(shí)現(xiàn)需求,在看別人的代碼就可以看懂了赎离,而不是懵的逛犹,只會(huì)復(fù)制黏貼。
其實(shí)java種的類(lèi)很多方法很多梁剔,不是每個(gè)都要理解到虽画、需要用的時(shí)候可以看懂就好。但是常用的還是要理解荣病,比如時(shí)間類(lèi)码撰,因?yàn)楣ぷ髦杏玫降木秃芏唷?shù)據(jù)就天天要使用到時(shí)間个盆。
我還處于升級(jí)到第一步的過(guò)程中-----熟練
目前不怎么喜歡用語(yǔ)雀記筆記脖岛,因?yàn)楣P記記多了,加載的時(shí)候很慢砾省〖Ω冢看的時(shí)候覺(jué)得不是很方便
參考文章1:Java的Date類(lèi)與Calendar類(lèi)
參考文章2:java時(shí)間類(lèi)Date、Calendar及用法(推薦)
參考文章3:java 中的Calendar常用方法(推薦)
參考文章4:java 日期相關(guān)Date编兄、SimpleDateFormat轩性、Calendar區(qū)分和使用