Java中對(duì)于時(shí)間類型的描述慕的,都是基于從時(shí)間原點(diǎn)至當(dāng)前代碼執(zhí)行瞬間所經(jīng)過的毫秒數(shù),本質(zhì)上都是一個(gè)long型的數(shù)據(jù)甩骏。
1. java.util.Date
體現(xiàn)時(shí)間和日期的基本的類
規(guī)則:
- 年:
實(shí)際年份數(shù)字-1900
- 月:
0-11 表示 1月-12月
- 日:
1-31 表示 1日-31日
- 小時(shí):
0-23 表示 0時(shí)-23時(shí)
- 分鐘:
0-59 表示 0分-59分
- 秒:
0-59 表示 0-59秒
1.1 構(gòu)造方法
- Date()
構(gòu)建一個(gè)表示當(dāng)前瞬間的時(shí)間對(duì)象
- Date(long date)
根據(jù)毫秒數(shù)構(gòu)建一個(gè)表示時(shí)間原點(diǎn)經(jīng)過毫秒數(shù)后的事件對(duì)象
//當(dāng)前時(shí)間
Date d1 = new Date();
System.out.println(d1);
//構(gòu)造特定時(shí)間
Date d2 = new Date(1000);
System.out.println(d2);
Date d3 = new Date(-1000);
System.out.println(d3);
1.2 API方法
- before(Date when)和after(Date when)
返回值boolean
判斷參數(shù)when是否比當(dāng)前日期對(duì)象早(before)或晚(after)
Date d2 = new Date(1000);
System.out.println(d2);
Date d3 = new Date(-1000);
System.out.println(d3);
Date d4 = new Date(1000);
System.out.println(d3);
boolean b1 = d2.before(d3);
System.out.println(b1);
boolean b2 = d2.after(d3);
System.out.println(b2);
boolean b3 = d2.before(d4);
System.out.println(b3);
結(jié)果
- compareTo(Date anotherDate)
返回值:int
int i1 = d2.compareTo(d3);//d2晚于d3
int i2 = d3.compareTo(d2);//d3早于d2
int i3 = d2.compareTo(d4);//d2和d3相等
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
運(yùn)行結(jié)果
-
equals(Date anotherDate)
返回值boolean
源碼:
equals的源碼
比較的是兩個(gè)時(shí)間的毫秒數(shù)窗市,實(shí)際上比較的兩個(gè)對(duì)象是否表示的是同一個(gè)時(shí)間 getTime()
返回值long
獲得當(dāng)前日期對(duì)象表示時(shí)間的毫秒數(shù)。
Date d = new Date();
long l = d.getTime();
- setTime(long mills)
返回值void
利用參數(shù)mills設(shè)置時(shí)間對(duì)象表示的時(shí)間
2. java.sql.Date和java.sql.Time
他們都是java.util.Date的子類
將數(shù)據(jù)庫中的日期類型數(shù)據(jù)取出后
在Java中的體現(xiàn)就是java.sql.Date類的一個(gè)對(duì)象饮笛。在Java中它大多數(shù)表示的是精確到“年-月-日”時(shí)間
在Java中的體現(xiàn)就是java.sql.Time類的一個(gè)對(duì)象咨察。在Java中它大多數(shù)表示的是精確到“時(shí)-分-秒”時(shí)間
3. java.sql.Timestamp
他是java.util.Date的子類
被稱為“時(shí)間戳”,精確到非常高福青,通常用它表示數(shù)據(jù)庫中時(shí)間數(shù)據(jù)摄狱。
一般表示精確度是“年-月-日 時(shí)-分-秒”
4. java.util.Calendar
Calendar類被稱為“日歷類”脓诡,提供了大量的靜態(tài)常量屬性和API方法對(duì)日期和時(shí)間進(jìn)行操作。單純操作時(shí)間媒役,建議使用Calendar類來完成時(shí)間構(gòu)建和賦值操作祝谚。
API方法
4.1.1 static getInstance()返回值:Calendar
構(gòu)建一個(gè)表示當(dāng)前瞬間的日歷類對(duì)象
Calendar cal = Calendar.getInstance();
4.1.2 get(int field)返回值:int
根據(jù)輸入filed的值,取得對(duì)應(yīng)日歷上的數(shù)據(jù)
Calendar cal = Calendar.getInstance();
System.out.println(cal);
int year = cal.get(Calendar.YEAR); //取得年份
int month = cal.get(Calendar.MONTH)+1; //取得月
int day = cal.get(Calendar.DAY_OF_MONTH); //取得日
int hour = cal.get(Calendar.HOUR); //取得時(shí)
int minute = cal.get(Calendar.MINUTE); //取得分
int second = cal.get(Calendar.SECOND); //取得秒
int week = cal.get(Calendar.DAY_OF_WEEK)-1; //星期
filed | 數(shù)值 | 含義 |
---|---|---|
ERA | 0 | 公元AD/公元前BC |
YEAR | 1 | 四位數(shù)的年份酣衷,比如:2019 |
MONTH | 2 | 月份交惯,取值:0-11,對(duì)應(yīng)1月-12月 |
WEEK_OF_YEAR | 3 | 本年中的第幾周 |
WEEK_OF_MONTH | 4 | 本月中的第幾周 |
DATE | 5 | 本月中第幾天穿仪,相當(dāng)于日歷中“日” |
DAY_OF_MONTH | 5 | 本月中第幾天席爽,相當(dāng)于日歷中“日” |
DAY_OF_YEAR | 6 | 本年中第幾天 |
DAY_OF_WEEK | 7 | 取值1-7,對(duì)應(yīng)星期日-星期六 |
DAY_OF_WEEK_IN_MONTH | 8 | 某月中第幾周(按日計(jì)算啊片,每7天一周) |
AM_PM | 9 | 上下午的區(qū)分 |
HOUR | 10 | 小時(shí)(0 - 11) |
HOUR_OF_DAY | 11 | 小時(shí)(0 - 23) |
MINUTE | 12 | 分鐘 |
SECOND | 13 | 秒 |
MILLISECOND | 14 | 毫秒 |
ZONE_OFFSET | 15 | 時(shí)區(qū)相關(guān) |
DST_OFFSET | 16 | 時(shí)區(qū)相關(guān) |
FIELD_COUNT | 17 | 屬性總數(shù) |
4.1.3 set(int field, int value)返回值:void
為某個(gè)filed屬性設(shè)置值
(1)為年設(shè)置值
cal.set(Calendar.YEAR, 1995);
(2)為月設(shè)置值
cal.set(Calendar.MONTH, 5); //6月
cal.set(Calendar.MONTH, Calendar.JUNE); //6月
月份 | 英文 | 數(shù)值 |
---|---|---|
1月 | JANUARY | 0 |
2月 | FEBRUARY | 1 |
3月 | MARCH | 2 |
4月 | APRIL | 3 |
5月 | MAY | 4 |
6月 | JUNE | 5 |
7月 | JULY | 6 |
8月 | AUGUST | 7 |
9月 | SEPTEMBER | 8 |
10月 | OCTOBER | 9 |
11月 | NOVEMBER | 10 |
12月 | DECEMBER | 11 |
(3)為日設(shè)置值
cal.set(Calendar.DAY_OF_MONTH, 15); //15日
小時(shí)只锻,分鐘,秒的設(shè)置類似紫谷,略
(4) 設(shè)置星期
如果直接為Calendar對(duì)象設(shè)置星期齐饮,時(shí)間會(huì)強(qiáng)制按照星期對(duì)應(yīng)的日期進(jìn)行更改
比如某個(gè)Calendar對(duì)象表示的是2019年4月11日(星期四)
通過代碼
cal.set(Calendar.DAY_OF_WEEK, 7);//星期六
cal.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY);//星期六
這個(gè)對(duì)象變成了2019年4月13日(星期六),會(huì)將cal對(duì)象設(shè)置其所在周的星期六笤昨。
星期 | 英文 | 數(shù)值 |
---|---|---|
星期日 | SUNDAY | 1 |
星期一 | MONDAY | 2 |
星期二 | TUESDAY | 3 |
星期三 | WEDNESDAY | 4 |
星期四 | THURSDAY | 5 |
星期五 | FRIDAY | 6 |
星期六 | SATURDAY | 7 |
4.1.4 set(int year, int month, int day)返回值:void
直接對(duì)年月日進(jìn)行賦值
4.1.5 set(int year, int month, int day, int hour, int minute)返回值:void
直接對(duì)年月日時(shí)分進(jìn)行賦值
4.1.6 set(int year, int month, int day, int hour, int minute, int second)返回值:void
直接對(duì)年月日時(shí)分秒進(jìn)行賦值
cal.set(1998, Calendar.JULY, 11, 23, 12, 0); //1998-07-11 23:12:00
4.1.7 getTime()返回值:java.util.Date
將Calendar對(duì)象轉(zhuǎn)換成java.util.Date對(duì)象
Date date = cal.getTime();
4.1.8 getTimeInMillis()返回值:long
得到時(shí)間對(duì)應(yīng)的毫秒數(shù)
long mill = cal.getTimeInMillis();
5. java.text.SimpleDateFormat
提供了可以在String和java.util.Date之間進(jìn)行類型轉(zhuǎn)換的方法
5.1 構(gòu)造方法和時(shí)間表示格式
SimpleDateFormat的構(gòu)造方法有多個(gè)沈矿,參考API文檔。其中最重要的是
- new SimpleDateFormat(String format)
format字符串是用于描述轉(zhuǎn)換類的適用的日期格式咬腋,其由一些特殊的字符組成
字符 | 時(shí)間描述 | 示例 |
---|---|---|
G | 公元 | 公元AD/公元前BC |
y | 四位數(shù)年 | 2019 |
Y | 兩位數(shù)年 | 19 |
M | 月 | 07 |
L | 月 | 07 |
w | 年中第幾周 | 27 |
W | 月中第幾周 | 3 |
D | 年中第幾天 | 1-365 |
d | 月中第幾天 | 1-31 |
a | 上下午 | AM/PM |
H | 小時(shí) | 0-23 |
h | 小時(shí) | 1-12 |
K | 小時(shí) | 0-11 |
k | 小時(shí) | 1-24 |
m | 分鐘 | 0-59 |
s | 秒 | 0-59 |
S | 毫秒 | 0-999 |
z | 時(shí)區(qū) | Pacific Standard Time; PST; GMT-08:00 |
Z | 時(shí)區(qū) | -0800 |
X | 時(shí)區(qū) | -08; -0800; -08:00 |
常見字符的組合用法
format字符組合 | 示例 |
---|---|
yyyy-MM-dd | 1999-07-25 |
MM/dd/yyyy | 07/25/1999 |
yyyy年MM月dd日 | 1999年07月25日 |
yyyy-MM-dd HH:mm:ss | 1999-07-25 11:30:00 |
yyyy-MM-dd HH:mm:ss Z | 1999-07-25 11:30:00 +0800 |
利用SimpleDateFormat類的構(gòu)造方法創(chuàng)建對(duì)象時(shí)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf對(duì)象可以將Date類型轉(zhuǎn)換成“yyyy-MM-dd”的字符串,同樣也能將“yyyy-MM-dd”的字符串轉(zhuǎn)換成對(duì)應(yīng)的Date對(duì)象
5.2 日期轉(zhuǎn)文本(Date->String)
- format(Date date)
返回值:String
將參數(shù)date類型按照sdf約定的格式睡互,轉(zhuǎn)換成對(duì)應(yīng)格式的字符串
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒");
String str = sdf.format(d);
System.out.println(str);
輸出結(jié)果:2019年04月11日 14時(shí)29分51秒
5.3 文本轉(zhuǎn)日期(String->Date)
- parse(String str)
返回值:java.util.Date
將參數(shù)str按照sdf約定的格式根竿,轉(zhuǎn)換成對(duì)應(yīng)的Date對(duì)象
String str = "1994-07-25";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date);
在進(jìn)行字符串轉(zhuǎn)日期的過程時(shí),可能發(fā)生ParseException的異常就珠,主要原因就是字符串str可能與約定的格式不符寇壳,或者干脆就不是一個(gè)日期