Date日期
概述
java.util.Date類 表示特定的瞬間,精確到毫秒秽梅。
繼續(xù)查閱Date類的描述,發(fā)現(xiàn)Date擁有多個(gè)構(gòu)造函數(shù)环壤,只是部分已經(jīng)過時(shí)郑现,但是其中有未過時(shí)的構(gòu)造函數(shù)可以把毫秒值轉(zhuǎn)成日期對(duì)象接箫。
- public Date():分配Date對(duì)象并初始化此對(duì)象辛友,以表示分配它的時(shí)間(精確到毫秒)瞎领。
- public Date(long date):分配Date對(duì)象并初始化此對(duì)象九默,以表示自從標(biāo)準(zhǔn)基準(zhǔn)時(shí)間(稱為“歷元(epoch)”宾毒,即1970年1月1日00:00:00 GMT)以來(lái)的指定毫秒數(shù)乙各。
tips: 由于我們處于東八區(qū)耳峦,所以我們的基準(zhǔn)時(shí)間為1970年1月1日8時(shí)0分0秒蹲坷。
簡(jiǎn)單來(lái)說(shuō):使用無(wú)參構(gòu)造循签,可以自動(dòng)設(shè)置當(dāng)前系統(tǒng)時(shí)間的毫秒時(shí)刻县匠;指定long類型的構(gòu)造參數(shù)乞旦,可以自定義毫秒時(shí)刻杆查。例如:
/*
java.util.Date:表示日期和時(shí)間的類
類 Date 表示特定的瞬間闺阱,精確到毫秒。
毫秒:千分之一秒 1000毫秒=1秒
特定的瞬間:一個(gè)時(shí)間點(diǎn),一剎那時(shí)間
2088-08-08 09:55:33:333 瞬間
2088-08-08 09:55:33:334 瞬間
2088-08-08 09:55:33:334 瞬間
...
毫秒值的作用:可以對(duì)時(shí)間和日期進(jìn)行計(jì)算
2099-01-03 到 2088-01-01 中間一共有多少天
可以日期轉(zhuǎn)換為毫秒進(jìn)行計(jì)算,計(jì)算完畢,在把毫秒轉(zhuǎn)換為日期
把日期轉(zhuǎn)換為毫秒:
當(dāng)前的日期:2088-01-01
時(shí)間原點(diǎn)(0毫秒):1970 年 1 月 1 日 00:00:00(英國(guó)格林威治)
就是計(jì)算當(dāng)前日期到時(shí)間原點(diǎn)之間一共經(jīng)歷了多少毫秒 (3742767540068L)
注意:
中國(guó)屬于東八區(qū),會(huì)把時(shí)間增加8個(gè)小時(shí)
1970 年 1 月 1 日 08:00:00
把毫秒轉(zhuǎn)換為日期:
1 天 = 24 × 60 × 60 = 86400 秒 = 86400 x 1000 = 86400000毫秒
*/
public class Demo01Date {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());//獲取當(dāng)前系統(tǒng)時(shí)間到1970 年 1 月 1 日 00:00:00經(jīng)歷了多少毫秒
}
}
import java.util.Date;
/*
tips:在使用println方法時(shí)舔琅,會(huì)自動(dòng)調(diào)用Date類中的toString方法备蚓。
Date類對(duì)Object類中的toString方法進(jìn)行了覆蓋重寫郊尝,所以結(jié)果為指定格式的字符串扎即。
*/
public class Demo01Date {
public static void main(String[] args) {
// 創(chuàng)建日期對(duì)象谚鄙,把當(dāng)前的時(shí)間
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2018
// 創(chuàng)建日期對(duì)象闷营,把當(dāng)前的毫秒值轉(zhuǎn)成日期對(duì)象
System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
}
}
常用方法
Date類中的多數(shù)方法已經(jīng)過時(shí),常用的方法有:
- public long getTime() 把日期對(duì)象轉(zhuǎn)換成對(duì)應(yīng)的時(shí)間毫秒值。
DateFormat類
java.text.DateFormat 是日期/時(shí)間格式化子類的抽象類,我們通過這個(gè)類可以幫我們完成日期和文本之間的轉(zhuǎn)換,也就是可以在Date對(duì)象與String對(duì)象之間進(jìn)行來(lái)回轉(zhuǎn)換腥光。
- 格式化:按照指定的格式议双,從Date對(duì)象轉(zhuǎn)換為String對(duì)象平痰。
- 解析:按照指定的格式,從String對(duì)象轉(zhuǎn)換為Date對(duì)象赔蒲。
構(gòu)造方法
由于DateFormat為抽象類舞虱,不能直接使用,所以需要常用的子類java.text.SimpleDateFormat焕刮。這個(gè)類需要一個(gè)模式(格式)來(lái)指定格式化或解析的標(biāo)準(zhǔn)配并。構(gòu)造方法為:
- public SimpleDateFormat(String pattern):用給定的模式和默認(rèn)語(yǔ)言環(huán)境的日期格式符號(hào)構(gòu)造SimpleDateFormat。
參數(shù)pattern是一個(gè)字符串观腊,代表日期時(shí)間的自定義格式。
格式規(guī)則
標(biāo)識(shí)字母(區(qū)分大小寫) | 含義 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 時(shí) |
m | 分 |
s | 秒 |
常用方法
- public String format(Date date):將Date對(duì)象格式化為字符串。
- public Date parse(String source):將字符串解析為Date對(duì)象嫌褪。
public class Demo01DateFormat {
public static void main(String[] args) throws ParseException {
demo02();
}
/*
使用DateFormat類中的方法parse,把文本解析為日期
使用步驟:
1.創(chuàng)建SimpleDateFormat對(duì)象,構(gòu)造方法中傳遞指定的模式
2.調(diào)用SimpleDateFormat對(duì)象中的方法parse,把符合構(gòu)造方法中模式的字符串,解析為Date日期
注意:
public Date parse(String source) throws ParseException
parse方法聲明了一個(gè)異常叫ParseException
如果字符串和構(gòu)造方法的模式不一樣,那么程序就會(huì)拋出此異常
調(diào)用一個(gè)拋出了異常的方法,就必須的處理這個(gè)異常,要么throws繼續(xù)拋出這個(gè)異常,要么try catch自己處理
*/
private static void demo02() throws ParseException {
//1.創(chuàng)建SimpleDateFormat對(duì)象,構(gòu)造方法中傳遞指定的模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒");
//2.調(diào)用SimpleDateFormat對(duì)象中的方法parse,把符合構(gòu)造方法中模式的字符串,解析為Date日期
//Date parse(String source) 把符合模式的字符串,解析為Date日期
Date date = sdf.parse("2088年08月08日 15時(shí)51分54秒");
System.out.println(date);
}
/*
使用DateFormat類中的方法format,把日期格式化為文本
使用步驟:
1.創(chuàng)建SimpleDateFormat對(duì)象,構(gòu)造方法中傳遞指定的模式
2.調(diào)用SimpleDateFormat對(duì)象中的方法format,按照構(gòu)造方法中指定的模式,把Date日期格式化為符合模式的字符串(文本)
*/
private static void demo01() {
//1.創(chuàng)建SimpleDateFormat對(duì)象,構(gòu)造方法中傳遞指定的模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒");
//2.調(diào)用SimpleDateFormat對(duì)象中的方法format,按照構(gòu)造方法中指定的模式,把Date日期格式化為符合模式的字符串(文本)
//String format(Date date) 按照指定的模式,把Date日期,格式化為符合模式的字符串
Date date = new Date();
String d = sdf.format(date);
System.out.println(date);//Sun Aug 08 15:51:54 CST 2088
System.out.println(d);//2088年08月08日 15時(shí)51分54秒
}
}
注意:
模式中的字母不能更改,連接模式的符號(hào)可以改變
"yyyy年MM月dd日 HH時(shí)mm分ss秒"
Calendar日歷
/*
java.util.Calendar類:日歷類
Calendar類是一個(gè)抽象類,里邊提供了很多操作日歷字段的方法(YEAR财忽、MONTH紧唱、DAY_OF_MONTH、HOUR )
Calendar類無(wú)法直接創(chuàng)建對(duì)象使用,里邊有一個(gè)靜態(tài)方法叫g(shù)etInstance(),該方法返回了Calendar類的子類對(duì)象
static Calendar getInstance() 使用默認(rèn)時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷。
*/
public class Demo01Calendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();//多態(tài)
System.out.println(c);
}
}
/*
Calendar類的常用成員方法:
public int get(int field):返回給定日歷字段的值轻庆。
public void set(int field, int value):將給定的日歷字段設(shè)置為給定值。
public abstract void add(int field, int amount):根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量。
public Date getTime():返回一個(gè)表示此Calendar時(shí)間值(從歷元到現(xiàn)在的毫秒偏移量)的Date對(duì)象。
成員方法的參數(shù):
int field:日歷類的字段,可以使用Calendar類的靜態(tài)成員變量獲取
public static final int YEAR = 1; 年
public static final int MONTH = 2; 月
public static final int DATE = 5; 月中的某一天
public static final int DAY_OF_MONTH = 5;月中的某一天
public static final int HOUR = 10; 時(shí)
public static final int MINUTE = 12; 分
public static final int SECOND = 13; 秒
*/
public class Demo02Calendar {
public static void main(String[] args) {
demo04();
}
/*
public Date getTime():返回一個(gè)表示此Calendar時(shí)間值(從歷元到現(xiàn)在的毫秒偏移量)的Date對(duì)象。
把日歷對(duì)象,轉(zhuǎn)換為日期對(duì)象
*/
private static void demo04() {
//使用getInstance方法獲取Calendar對(duì)象
Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date);
}
/*
public abstract void add(int field, int amount):根據(jù)日歷的規(guī)則隘擎,為給定的日歷字段添加或減去指定的時(shí)間量。
把指定的字段增加/減少指定的值
參數(shù):
int field:傳遞指定的日歷字段(YEAR,MONTH...)
int amount:增加/減少指定的值
正數(shù):增加
負(fù)數(shù):減少
*/
private static void demo03() {
//使用getInstance方法獲取Calendar對(duì)象
Calendar c = Calendar.getInstance();
//把年增加2年
c.add(Calendar.YEAR,2);
//把月份減少3個(gè)月
c.add(Calendar.MONTH,-3);
int year = c.get(Calendar.YEAR);
System.out.println(year);
int month = c.get(Calendar.MONTH);
System.out.println(month);//西方的月份0-11 東方:1-12
//int date = c.get(Calendar.DAY_OF_MONTH);
int date = c.get(Calendar.DATE);
System.out.println(date);
}
/*
public void set(int field, int value):將給定的日歷字段設(shè)置為給定值蹲姐。
參數(shù):
int field:傳遞指定的日歷字段(YEAR,MONTH...)
int value:給指定字段設(shè)置的值
*/
private static void demo02() {
//使用getInstance方法獲取Calendar對(duì)象
Calendar c = Calendar.getInstance();
//設(shè)置年為9999
c.set(Calendar.YEAR,9999);
//設(shè)置月為9月
c.set(Calendar.MONTH,9);
//設(shè)置日9日
c.set(Calendar.DATE,9);
//同時(shí)設(shè)置年月日,可以使用set的重載方法
c.set(8888,8,8);
int year = c.get(Calendar.YEAR);
System.out.println(year);
int month = c.get(Calendar.MONTH);
System.out.println(month);//西方的月份0-11 東方:1-12
int date = c.get(Calendar.DATE);
System.out.println(date);
}
/*
public int get(int field):返回給定日歷字段的值柴墩。
參數(shù):傳遞指定的日歷字段(YEAR,MONTH...)
返回值:日歷字段代表的具體的值
*/
private static void demo01() {
//使用getInstance方法獲取Calendar對(duì)象
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
System.out.println(year);
int month = c.get(Calendar.MONTH);
System.out.println(month);//西方的月份0-11 東方:1-12
//int date = c.get(Calendar.DAY_OF_MONTH);
int date = c.get(Calendar.DATE);
System.out.println(date);
}
}
根據(jù)Calendar類的API文檔,常用方法有:
- public int get(int field):返回給定日歷字段的值凫岖。
- public void set(int field, int value):將給定的日歷字段設(shè)置為給定值江咳。
- public abstract void add(int field, int amount):根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量哥放。
- public Date getTime():返回一個(gè)表示此Calendar時(shí)間值(從歷元到現(xiàn)在的毫秒偏移量)的Date對(duì)象歼指。
Calendar類中提供很多成員常量,代表給定的日歷字段:
字段值 | 含義 |
---|---|
YEAR | 年 |
MONTH | 月(從0開始甥雕,可以+1使用) |
DAY_OF_MONTH | 月中的天(幾號(hào)) |
HOUR | 時(shí)(12小時(shí)制) |
HOUR_OF_DAY | 時(shí)(24小時(shí)制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 周中的天(周幾踩身,周日為1,可以-1使用) |
小貼士:
西方星期的開始為周日犀农,中國(guó)為周一惰赋。
在Calendar類中,月份的表示是以0-11代表1-12月呵哨。
日期是有大小關(guān)系的赁濒,時(shí)間靠后,時(shí)間越大孟害。