Java基礎進階筆記 - Day01 - 第二章 日期時間類
- Java基礎進階筆記 - Day01 - 第二章 日期時間類
-
- 2.1 Date類
- 2.2 DateFormat類
- 2.3 練習
- 2.4 Calendar類
Java基礎進階筆記 - Day01 - 第二章 日期時間類
系統:Win10
JDK:1.8.0_121
IDE:IntelliJ IDEA 2017.3.7
2.1 Date類
概述
java.util.Date類:表示特定的瞬間,精确到毫秒
繼續查閱Date類的描述,發現Date擁有多個構造函數,隻是部分已經過時,但是其中有未過時的構造函數可以把毫秒值轉成日期對象
- public Date():配置設定Date對象并初始化對象,以表示配置設定它的時間(精确到毫秒)
- public Date(long date):配置設定Date對象并初始化此對象,以表示自從标準基準時間(稱為“曆元(epoch)”,即1970年1月1日00:00:00 GMT)以來的指定毫秒數
小貼士:由于我們中國處于東八區,是以我們的基準時間為1970年1月1日8時0分0秒
簡單來說:使用無參構造,可以自動設定目前系統時間的毫秒時刻;指定long類型的構造參數,可以自定義毫秒時刻。例如:
public class DateDemo01 {
public static void main(String[] args) {
// 建立日期對象,把目前時間轉換為日期對象
System.out.println(new Date()); // Wed Nov 25 16:42:38 CST 2020
// 建立日期對象,把目前的毫秒值轉成日期對象
System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
}
}
運作結果:
小貼士:在使用println方法時,會自動調用Date類中的toString方法。Date類對Object類中的toString方法進行了覆寫重寫,是以結果為指定格式的字元串
toLocaleString可以按本地時間格式輸出時間
常用方法
Date類中的多數方法已經過時,常用的方法有:
- public long getTime():把日期對象轉換成對應的時間毫秒值
2.2 DateFormat類
java.text.DateFormat:是時間/日期格式化子類的抽象類,我們通過這個類可以幫助我們完成日期和文本之間的轉換,也就是可以在Date對象與String對象之間進行來回轉換
- 格式化:按照指定的格式,從Date對象轉換為String對象
- 解析:按照指定的格式,從String對象轉換為Date對象
構造方法
由于DateFormat為抽象類,不能直接使用,是以需要常用的子類java.text.SimpleDateFormat。這個類需要一個模式(格式)來指定格式化或解析的标準。構造方法為:
-
public SimpleDateFormat(String pattern):用給定的模式和預設語言環境的日期格式符号構造SimpleDateFormat
參數pattern是一個字元串,代表日期時間的自定義格式
格式規則
常用的格式規則為:
辨別字母(區分大小寫) | 含義 |
---|---|
y | 當天所在的年度 |
Y | 當周所在的年度,跨年這一周的每一天都算下一年的年度 |
M | 月 |
d | 日 |
H | 時 |
m | 分 |
s | 秒 |
備注:更詳細的格式規則,可以參考SimpleDateFormat類的API()文檔,年的用法特别要注意,一般都用小寫的 y
建立SimpleDateFormat對象的代碼如下:
public class DateDemo02 {
public static void main(String[] args) {
// 對應的日期格式如:2020-11-25 19:52:56
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
常用方法
DateFormat類的常用方法有:
- public String format(Date date):将一個Date格式化為日期/時間字元串
- public Date parse(String source):從給定字元串開始解析文本,以生成一個日期
format方法
使用format方法的代碼如下:
/*
将Date對象轉換成String
*/
public class DateDemo03 {
public static void main(String[] args) {
Date date = new Date();
// 建立日期格式化對象,在擷取格式化對象時可以指定風格
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
String str = dateFormat.format(date);
System.out.println(str);
}
}
運作結果:
parse方法
使用parse方法的代碼如下:
/*
把String按指定格式轉換成Date對象
*/
public class DateDemo04 {
public static void main(String[] args) throws ParseException {
// 建立日期格式化對象,在擷取格式化對象時可以指定風格
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
String str = "2020年11月26日";
Date date = dateFormat.parse(str);
System.out.println(date); // Thu Nov 26 00:00:00 CST 2020
}
}
運作結果:
2.3 練習
使用日期時間相關的API,計算一個人已經出生了多少天
解題思路:
- 輸入自己出生日期
- 擷取目前日期
- 将兩個日期轉成毫秒值相減(目前時間-出生日期)
- 将毫秒值的內插補點轉成天
代碼實作:
/*
使用日期時間相關的API,計算一個人已經出生了多少天
*/
public class Test {
public static void main(String[] args) throws ParseException {
/*
1.輸入出生日期
2.擷取目前日期
3.将兩個日期轉成毫秒值相減(目前時間-出生日期)
4.将毫秒值的內插補點轉成天
*/
// 1.輸入出生日期
System.out.println("請輸入出生日期:格式 yyyy-MM-dd");
Scanner sc = new Scanner(System.in);
String str = sc.next();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = dateFormat.parse(str);
// 2.擷取目前日期
Date today = new Date();
// 3.将兩個日期轉成毫秒值相減
long time = today.getTime() - birthday.getTime();
// 4.将毫秒值的內插補點轉成天
long day = time / 1000 / 60 / 60 / 24;
if (day < 0) {
System.out.println("還沒出生!");
} else {
System.out.println(day);
}
}
}
運作結果:
2.4 Calendar類
概念
以前我們生活中應該都有見到過手撕的紙質月曆
java.util.Calendar 是月曆類,在Date後出現,替換掉了許多Date的方法。該類将所有可能用到的時間資訊封裝為靜态成員變量,友善擷取。月曆類就是友善擷取各個時間屬性的
擷取方式
Calendar為抽象類,由于語言敏感性,Calendar類在建立對象時并非直接建立,而是通過靜态方法建立,傳回子類對象,如下:
Calendar靜态方法
-
public static Calendar getInstance():使用預設時區和語言環境獲得一個月曆
例如:
public class CalendarDemo01 {
public static void main(String[] args) throws ParseException {
Calendar calendar = Calendar.getInstance();
}
}
常用方法
根據Calendar類的API文檔,常用方法有:
- public int get(int field):傳回給定月曆字段的值
- public void set(int field, int value):将給定的月曆字段設定為給定值
- public abstract void add(int field, int amount):根據月曆的規則,為給定的月曆字段添加或減去指定的時間量
- public Date getTime():傳回一個表示此Calendar時間值(從曆元[即格林威治标準時間1970年1月1日的00:00:00]至現在的毫秒偏移量)的Date對象
Calendar類中提供很多成員常量,代表給定的月曆字段:
字段值 | 含義 |
---|---|
YEAR | 年 |
MONTH | 月(從0開始,可以+1使用) |
DAY_OF_MONTH | 月中的天(幾号) |
HOUR | 時(12小時制) |
HOUR_OF_DAY | 時(24小時制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 周中的天(周幾,周日為1,可以-1使用) |
get/set方法
get方法用來擷取指定字段的值,代碼如下:
public class CalendarDemo02 {
public static void main(String[] args) throws ParseException {
// 建立Calendar對象
Calendar calendar = Calendar.getInstance();
// 擷取年
int year = calendar.get(Calendar.YEAR);
// 擷取月
int month = calendar.get(Calendar.MONTH) + 1;
// 擷取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");
}
}
運作結果:
set方法用來設定指定字段的值,代碼如下:
public class CalendarDemo03 {
public static void main(String[] args) throws ParseException {
// 建立Calendar對象
Calendar calendar = Calendar.getInstance();
// 設定年
calendar.set(Calendar.YEAR, 2345);
// 設定月
calendar.set(Calendar.MONTH, 05);
// 設定日
calendar.set(Calendar.DAY_OF_MONTH, 07);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");
}
}
運作結果:
add方法
add方法可以對指定月曆字段的值進行加減操作,如果第二個參數為正數則加上偏移量,如果為負數則減去偏移量。代碼如下:
public class CalendarDemo04 {
public static void main(String[] args) throws ParseException {
// 建立Calendar對象
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");
// 使用add方法
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -14);
int year1 = calendar.get(Calendar.YEAR);
int month1 = calendar.get(Calendar.MONTH) + 1;
int day1 = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year1 + "年" + month1 + "月" + day1 + "日");
}
}
運作結果:
getTime方法
Calendar中的getTime方法并不是擷取毫秒值,而是拿到對應的Date對象
public class CalendarDemo05 {
public static void main(String[] args) throws ParseException {
// 建立Calendar對象
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(date);
}
}
運作結果:
小貼士:
西方星期的開始為周日,中國為周一。是以DAY_OF_WEEK中的1-7代表周日-周六
在Calendar類中,月份的表示是以0-11代表1-12月
日期是有大小關系的,時間靠後,時間越大