1. 程式人生 > WINDOWS開發 >常用API - 時間日期類

常用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月。

? 日期是有大小關係的,時間靠後,時間越大。