常用API - 時間日期類
Date類
概述
java.util.Date
類 表示特定的瞬間,精確到毫秒。
繼續查閱Date類的描述,發現Date擁有多個建構函式,只是部分已經過時,但是其中有未過時的建構函式可以把毫秒值轉成日期物件。
public Date()
:分配Date物件並初始化此物件,以表示分配它的時間(精確到毫秒)。public Date(long date)
:分配Date物件並初始化此物件,以表示自從標準基準時間(稱為“曆元(epoch)”,即1970年1月1日00:00:00 GMT)以來的指定毫秒數。
tips: 由於我們處於東八區,所以我們的基準時間為1970年1月1日8時0分0秒。
簡單來說:使用無參構造,可以自動設定當前系統時間的毫秒時刻;指定long型別的構造引數,可以自定義毫秒時刻。例如:
package com; import java.util.Date; /** * 日期時間類 */ public class DateTest { public static void main(String[] args) { // 空參建構函式 Date date = new Date(); System.out.println(date); // 帶毫秒的long引數 毫秒轉日期 Date date1 = new Date(999999999999L); System.out.println(date1); // 日期轉毫秒 long millisecond = date.getTime(); System.out.println(millisecond); } }
tips:在使用println方法時,會自動呼叫Date類中的toString方法。
Date類對Object類中的toString方法進行了覆蓋重寫,所以結果為指定格式的字串。
常用方法
Date類中的多數方法已經過時,常用的方法有:
方法摘要 | 描述+ |
---|---|
public long getTime() | 把日期物件轉換成對應的時間毫秒值。 |
boolean after(Date when) | 測試此日期是否在指定日期之後。 |
boolean before(Date when) | 測試此日期是否在指定日期之前。 |
int compareTo(Date anotherDate) | 比較兩個日期的順序。等於返回 0;之前返回小於 0 的值;之後返回大於 0 的值。 |
boolean equals(Object obj) | 比較兩個日期的相等性。 |
Object clone() | 返回此物件的副本。 |
int hashCode() | 返回此物件的雜湊碼值。 |
String toString() | 把此 Date 物件轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一週中的某一天 (Sun,Mon,Tue,Wed,Thu,Fri,Sat)。 |
?
DateFormat類
java.text.DateFormat
是日期/時間格式化子類的抽象類,
我們通過這個類可以幫我們完成日期和文字之間的轉換,也就是可以在Date物件與String物件之間進行來回轉換。
-
格式化:按照指定的格式,從Date物件轉換為String物件。
-
解析:按照指定的格式,從String物件轉換為Date物件。
構造方法
由於DateFormat為抽象類,不能直接使用,所以需要常用的子類java.text.SimpleDateFormat
。
這個類需要一個模式(格式)來指定格式化或解析的標準。構造方法為:
public SimpleDateFormat(String pattern)
:用給定的模式和預設語言環境的日期格式符號構造SimpleDateFormat。
引數pattern是一個字串,代表日期時間的自定義格式。
構造方法摘要 | 描述 |
---|---|
SimpleDateFormat() | 用預設的模式和預設語言環境的日期格式符號構造 SimpleDateFormat。 |
SimpleDateFormat(String pattern) * | 用給定的模式和預設語言環境的日期格式符號構造 SimpleDateFormat。 |
SimpleDateFormat(String pattern,DateFormatSymbols formatSymbols) | 用給定的模式和日期符號構造 SimpleDateFormat。 |
SimpleDateFormat(String pattern,Locale locale) | 用給定的模式和給定語言環境的預設日期格式符號構造 SimpleDateFormat。 |
格式規則
常用的格式規則為:
標識字母(區分大小寫) | 含義 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 時 |
m | 分 |
s | 秒 |
常用方法
DateFormat類的常用方法有:
public String format(Date date)
:將Date物件格式化為字串。public Date parse(String source)
:將字串解析為Date物件。
方法摘要 | 描述 |
---|---|
Date parse(String text,ParsePosition pos) | 解析字串的文字,生成 Date。 |
String toPattern() | 返回描述此日期格式的模式字串。 |
void applyPattern(String pattern) | 將給定模式字串應用於此日期格式。 |
void applyLocalizedPattern(String pattern) | 將給定的本地化模式字串應用於此日期格式。 |
Object clone() | 建立此 SimpleDateFormat 的一個副本。 |
boolean equals(Object obj) | 比較給定物件與此 SimpleDateFormat 的相等性。 |
int hashCode() | 返回此 SimpleDateFormat 物件的雜湊碼值。 |
StringBuffer format(Date date,StringBuffer toAppendTo,FieldPosition pos) | 將給定的 Date 格式化為日期/時間字串,並將結果新增到給定的 StringBuffer。 |
AttributedCharacterIterator formatToCharacterIterator(Object obj) | 格式化生成 AttributedCharacterIterator 的物件。 |
Date get2DigitYearStart() | 返回在 100 年週期內被解釋的兩位數字年份的開始日期。 |
DateFormatSymbols getDateFormatSymbols() | 獲取此日期格式的日期和時間格式符號的一個副本。 |
void set2DigitYearStart(Date startDate) | 設定 100 年週期的兩位數年份,該年份將被解釋為從使用者指定的日期開始。 |
void setDateFormatSymbols(DateFormatSymbols newFormatSymbols) | 設定此日期格式的日期和時間格式符號。 |
String toLocalizedPattern() | 返回描述此日期格式的本地化模式字串。 |
簡單使用
package com;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) {
// **格式化** 日期轉換為文字
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = dateFormat.format(new Date());
System.out.println(str);
//**解析** 將文字轉為日期
try {
Date date = dateFormat.parse(str);
System.out.println(date);
} catch (ParseException e) {
System.out.println("解析異常");
}
}
}
練習
請使用日期時間相關的API,計算出一個人已經出生了多少天。
思路:
1.獲取當前時間對應的毫秒值
2.獲取自己出生日期對應的毫秒值
3.兩個時間相減(當前時間– 出生日期)
程式碼實現:
public static void function() throws Exception {
System.out.println("請輸入出生日期 格式 YYYY-MM-dd");
// 獲取出生日期,鍵盤輸入
String birthdayString = new Scanner(System.in).next();
// 將字串日期,轉成Date物件
// 建立SimpleDateFormat物件,寫日期模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 呼叫方法parse,字串轉成日期物件
Date birthdayDate = sdf.parse(birthdayString);
// 獲取今天的日期物件
Date todayDate = new Date();
// 將兩個日期轉成毫秒值,Date類的方法getTime
long birthdaySecond = birthdayDate.getTime();
long todaySecond = todayDate.getTime();
long secone = todaySecond-birthdaySecond;
if (secone < 0){
System.out.println("還沒出生呢");
} else {
System.out.println(secone/1000/60/60/24);
}
}
Calendar類
概念
java.util.Calendar
是日曆類,在Date後出現,替換掉了許多Date的方法。
該類將所有可能用到的時間資訊封裝為靜態成員變數,方便獲取。日曆類就是方便獲取各個時間屬性的。
獲取方式
Calendar為抽象類,由於語言敏感性,Calendar類在建立物件時並非直接建立,而是通過靜態方法建立,返回子類物件。
Calendar靜態方法
public static Calendar getInstance()
:使用預設時區和語言環境獲得一個日曆
例如:
package com;
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
System.out.println(c);
}
}
靜態欄位
Calendar類中提供很多成員常量,代表給定的日曆欄位:
欄位值 | 含義 |
---|---|
YEAR | 年 |
MONTH | 月(從0開始,可以+1使用) |
DAY_OF_MONTH | 月中的天(幾號) |
DATE | get 和 set 的欄位數字,指示一個月中的某天。 |
HOUR | 時(12小時制) |
HOUR_OF_DAY | 時(24小時制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 週中的天(周幾,週日為1,可以-1使用) |
DAY_OF_MONTH | get 和 set 的欄位數字,指示一個月中的某天。 |
DAY_OF_YEAR | get 和 set 的欄位數字,指示當前年中的天數。 |
DAY_OF_WEEK_IN_MONTH | get 和 set 的欄位數字,指示當前月中的第幾個星期。 |
AUGUST | 指示在格里高利曆和羅馬儒略曆中一年中第八個月的 MONTH 欄位值。 |
areFieldsSet | 如果 fields[] 與當前的設定時間同步,則返回 true。 |
APRIL | 指示在格里高利曆和羅馬儒略曆中一年中第四個月的 MONTH 欄位值。 |
AM_PM | get 和 set 的欄位數字,指示 HOUR 是在中午之前還是在中午之後。 |
AM | 指示從午夜到中午之前這段時間的 AM_PM 欄位值。 |
ALL_STYLES | 指示所有風格名稱的 getDisplayNames 的風格說明符,比如 "January" 和 "Jan"。 |
常用方法
根據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時間值(從曆元到現在的毫秒偏移量)的Date物件。
方法 | 描述 |
---|---|
int get(int field) | 返回給定日曆欄位的值。 欄位可以用上面的靜態欄位,如:Calendar.YEAR |
void set(int field,int value) | 將給定的日曆欄位設定為給定值。 |
abstract void add(int field,int amount) | 根據日曆的規則,為給定的日曆欄位新增或減去指定的時間量。 |
Date getTime() | 返回一個表示此 Calendar 時間值(從曆元至現在的毫秒偏移量)的 Date 物件。 |
boolean after(Object when) | 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之後,返回判斷結果。 |
boolean before(Object when) | 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之前,返回判斷結果。 |
void clear() | 將此 Calendar 的所日曆欄位值和時間值(從曆元至現在的毫秒偏移量)設定成未定義。 |
void clear(int field) | 將此 Calendar 的給定日曆欄位值和時間值(從曆元至現在的毫秒偏移量)設定成未定義。 |
Object clone() | 建立並返回此物件的一個副本。 |
int compareTo(Calendar anotherCalendar) | 比較兩個 Calendar 物件表示的時間值(從曆元至現在的毫秒偏移量)。 |
protected void complete() | 填充日曆欄位中所有未設定的欄位。 |
protected abstract void computeFields() | 將當前毫秒時間值 time 轉換為 fields[] 中的日曆欄位值。 |
protected abstract void computeTime() | 將 fields[] 中的當前日曆欄位值轉換為毫秒時間值 time。 |
boolean equals(Object obj) | 將此 Calendar 與指定 Object 比較。 |
int getActualMaximum(int field) | 給定此 Calendar 的時間值,返回指定日曆欄位可能擁有的最大值。 |
int getActualMinimum(int field) | 給定此 Calendar 的時間值,返回指定日曆欄位可能擁有的最小值。 |
static Locale[] getAvailableLocales() | 返回所有語言環境的陣列,此類的 getInstance 方法可以為其返回本地化的例項。 |
String getDisplayName(int field,int style,Locale locale) | 返回給定 style 和 locale 下的日曆 field 值的字串表示形式。 |
Map<String,Integer> getDisplayNames(int field,int style,Locale locale) | 返回給定 style 和 locale 下包含日曆 field 所有名稱的 Map 及其相應欄位值。 |
int getFirstDayOfWeek() | 獲取一星期的第一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。 |
abstract int getGreatestMinimum(int field) | 返回此 Calendar 例項給定日曆欄位的最高的最小值。 |
static Calendar getInstance() | 使用預設時區和語言環境獲得一個日曆。 |
static Calendar getInstance(Locale aLocale) | 使用預設時區和指定語言環境獲得一個日曆。 |
static Calendar getInstance(TimeZone zone) | 使用指定時區和預設語言環境獲得一個日曆。 |
static Calendar getInstance(TimeZone zone,Locale aLocale) | 使用指定時區和語言環境獲得一個日曆。 |
abstract int getLeastMaximum(int field) | 返回此 Calendar 例項給定日曆欄位的最低的最大值。 |
abstract int getMaximum(int field) | 返回此 Calendar 例項給定日曆欄位的最大值。 |
int getMinimalDaysInFirstWeek() | 獲取一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則此方法將返回 1。 |
abstract int getMinimum(int field) | 返回此 Calendar 例項給定日曆欄位的最小值。 |
long getTimeInMillis() | 返回此 Calendar 的時間值,以毫秒為單位。 |
TimeZone getTimeZone() | 獲得時區。 |
int hashCode() | 返回該此日曆的雜湊碼。 |
protected int internalGet(int field) | 返回給定日曆欄位的值。 |
boolean isLenient() | 判斷日期/時間的解釋是否為寬鬆的。 |
boolean isSet(int field) | 確定給定日曆欄位是否已經設定了一個值,其中包括因為呼叫 get 方法觸發內部欄位計算而導致已經設定該值的情況。 |
abstract void roll(int field,boolean up) | 在給定的時間欄位上新增或減去(上/下)單個時間單元,不更改更大的欄位。 |
void roll(int field,int amount) | 向指定日曆欄位新增指定(有符號的)時間量,不更改更大的欄位。 |
void set(int year,int month,int date) | 設定日曆欄位 YEAR、MONTH 和 DAY_OF_MONTH 的值。 |
void set(int year,int date,int hourOfDay,int minute) | 設定日曆欄位 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。 |
void set(int year,int minute,int second) | 設定欄位 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。 |
void setFirstDayOfWeek(int value) | 設定一星期的第一天是哪一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。 |
void setLenient(boolean lenient) | 指定日期/時間解釋是否是寬鬆的。 |
void setMinimalDaysInFirstWeek(int value) | 設定一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則使用值 1 呼叫此方法。 |
void setTime(Date date) | 使用給定的 Date 設定此 Calendar 的時間。 |
void setTimeInMillis(long millis) | 用給定的 long 值設定此 Calendar 的當前時間值。 |
void setTimeZone(TimeZone value) | 使用給定的時區值來設定時區。 |
String toString() | 返回此日曆的字串表示形式。 |
簡單使用
package com;
import java.util.Calendar;
/**
* Calendar類的常用方法
* 根據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時間值(從曆元到現在的毫秒偏移量)的Date物件。
*/
public class CalendarTest {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
// get 獲取日曆的某個欄位
System.out.println(c.get(Calendar.YEAR));
// 月份從0開始
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DAY_OF_YEAR));
// set 設定日曆的某個欄位
c.set(Calendar.YEAR,1995);
System.out.println(c.getTime());
c.set(1999,Calendar.DECEMBER,1);
System.out.println(c.getTime());
// add 修改指定的欄位,可以是整數也可以是負數
System.out.println("======add 加減=====");
c.add(Calendar.YEAR,10);
System.out.println(c.getTime());
// getTime 將日曆轉為日期Date
}
}
小貼士:
? 西方星期的開始為週日,中國為週一。
? 在Calendar類中,月份的表示是以0-11代表1-12月。
? 日期是有大小關係的,時間靠後,時間越大。