C語言中文網 目錄

Java時間日期的處理:Java Date類、Calendar類詳解

Java 中獲取當前時間,可以使用 java.util.Date 類和 java.util.Calendar 類完成。其中,Date 類主要封裝了系統的日期和時間的信息,Calendar 類則會根據系統的日歷來解釋 Date 對象。下面詳細介紹這兩個類的具體使用。

Date 類

Date 類表示系統特定的時間戳,可以精確到毫秒。Date 對象表示時間的默認順序是星期、月、日、小時、分、秒、年。

1. 構造方法

Date 類有如下兩個構造方法。
  • Date():此種形式表示分配 Date 對象并初始化此對象,以表示分配它的時間(精確到毫秒),使用該構造方法創建的對象可以獲取本地的當前時間。
  • Date(long date):此種形式表示從 GMT 時間(格林尼治時間)1970 年 1 月 1 日 0 時 0 分 0 秒開始經過參數 date 指定的毫秒數。

這兩個構造方法的使用示例如下:
Date date1=new Date();    //調用無參數構造函數
System.out.println(date1.toString());    //輸出:Wed May 18 21:24:40 CST 2016
Date date2=new Date(60000);    //調用含有一個long類型參數的構造函數
System.out.println(date2);    //輸出:Thu Jan 0108:01:00 CST 1970

Date 類的無參數構造方法獲取的是系統當前的時間,顯示的順序為星期、月、日、小時、分、秒、年。

Date 類帶 long 類型參數的構造方法獲取的是距離 GMT 指定毫秒數的時間,60000 毫秒是一分鐘,而 GMT(格林尼治標準時間)與 CST(中央標準時間)相差 8 小時,也就是說 1970 年 1 月 1 日 00:00:00 GMT 與 1970 年 1 月 1 日 08:00:00 CST 表示的是同一時間。 因此距離 1970 年 1 月 1 日 00:00:00 CST 一分鐘的時間為 1970 年 1 月 1 日 00:01:00 CST,即使用 Date 對象表示為 Thu Jan 01 08:01:00 CST 1970。

2. 常用方法

Date 類提供了許多與日期和事件相關的方法,其中常見的方法如表 1 所示。

表1 Date類中的常用方法
方法 描述
boolean after(Date when) 判斷此日期是否在指定日期之后
boolean before(Date when) 判斷此日期是否在指定日期之前
int compareTo(Date anotherDate) 比較兩個日期的順序
boolean equals(Object obj) 比較兩個日期的相等性
long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來,此 Date 對象表示的毫秒數
String toString() 把此 Date 對象轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。
其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及 Sat)

例 1

下面使用一個實例來具體演示 Date 類的使用。假設,某一天特定時間要去做一件事,而且那個時間已經過去一分鐘之后才想起來這件事還沒有辦,這時系統將會提示已經過去了多 長時間。具體的代碼如下:
import java.util.Date;
import java.util.Scanner;
public class Test11
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("請輸入要做的事情:");
        String title=input.next();
        Date date1=new Date();    //獲取當前日期
        System.out.println("["+title+"] 這件事發生時間為:"+date1);
        try
        {
            Thread.sleep(60000);//暫停 1 分鐘
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        Date date2=new Date();
        System.out.println("現在時間為:"+date2);
        if(date2.before(date1))
        {
            System.out.println("你還有 "+(date2.getTime()-date1.getTime())/1000+" 秒需要去完成【"+title+"】這件事!");
        }
        else
        {
            System.out.println("【"+title+"】事情已經過去了 "+(date2.getTime()-date1.getTime())/1000+" 秒");
        }
    }
}

在該程序中,分別使用 Date 類的無參數構造方法創建了兩個 Date 對象。在創建完第一個 Date 對象后,使用 Thread.sleep() 方法讓程序休眠 60 秒,然后再創建第二個 Date 對象,這樣第二個 Date 對象所表示的時間將會在第一個 Date 對象所表示時間之后,因此“date2.before(date1)”條件表達式不成立,從而執行 else 塊中的代碼,表示事情已經發生過。

運行該程序,執行結果如下所示。
請輸入要做的事情:
收快遞
【收快遞】這件事發生時間為:Fri Oct 12 11:11:07 CST 2018
現在時間為:Fri Oct 12 11:12:07 CST 2018
【收快遞】事情已經過去了 60 秒

Calendar 類

Calendar 類是一個抽象類,它為特定瞬間與 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日歷字段之間的轉換提供了一些方法,并為操作日歷字段(如獲得下星期的日期) 提供了一些方法。

創建 Calendar 對象不能使用 new 關鍵字,因為 Calendar 類是一個抽象類,但是它提供了一個 getInstance() 方法來獲得 Calendar類的對象。getInstance() 方法返回一個 Calendar 對象,其日歷字段已由當前日期和時間初始化。
Calendar c=Calendar.getInstance();

當創建了一個 Calendar 對象后,就可以通過 Calendar 對象中的一些方法來處理日期、時間。Calendar 類的常用方法如表 2 所示。

表2 Calendar類的常用方法
方法 描述
void add(int field, int amount) 根據日歷的規則,為給定的日歷字段 field 添加或減去指定的時間量 amount
boolean after(Object when) 判斷此 Calendar 表示的時間是否在指定時間 when 之后,并返回判斷結果
boolean before(Object when) 判斷此 Calendar 表示的時間是否在指定時間 when 之前,并返回判斷結果
void clear() 清空 Calendar 中的日期時間值
int compareTo(Calendar anotherCalendar) 比較兩個 Calendar 對象表示的時間值(從格林威治時間 1970 年 01 月 01 日
00 時 00 分 00 秒至現在的毫秒偏移量),大則返回 1,小則返回 -1,相等返回 0
int get(int field) 返回指定日歷字段的值
int getActualMaximum(int field) 返回指定日歷字段可能擁有的最大值
int getActualMinimum(int field) 返回指定日歷字段可能擁有的最小值
int getFirstDayOfWeek() 獲取一星期的第一天。根據不同的國家地區,返回不同的值
static Calendar getInstance() 使用默認時區和語言壞境獲得一個日歷
static Calendar getInstance(TimeZone zone) 使用指定時區和默認語言環境獲得一個日歷
static Calendar getInstance(TimeZone zone,
Locale aLocale)
使用指定時區和語言環境獲得一個日歷
Date getTime() 返回一個表示此 Calendar 時間值(從格林威治時間 1970 年 01 月 01 日 00 時
00 分 00 秒至現在的毫秒偏移量)的 Date 對象
long getTimeInMillis() 返回此 Calendar 的時間值,以毫秒為單位
void set(int field, int value) 為指定的日歷字段設置給定值
void set(int year, int month, int date) 設置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
void set(int year, int month, int date, int hourOfDay,
int minute, int second)
設置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值
void setFirstDayOfWeek(int value) 設置一星期的第一天是哪一天
void setTimeInMillis(long millis) 用給定的 long 值設置此 Calendar 的當前時間值

Calendar 對象可以調用 set() 方法將日歷翻到任何一個時間,當參數 year 取負數時表示公元前。Calendar 對象調用 get() 方法可以獲取有關年、月、日等時間信息,參數 field 的有效值由 Calendar 靜態常量指定。

Calendar 類中定義了許多常量,分別表示不同的意義。
  • Calendar.YEAR:年份。
  • Calendar.MONTH:月份。
  • Calendar.DATE:日期。
  • Calendar.DAY_OF_MONTH:日期,和上面的字段意義完全相同。
  • Calendar.HOUR:12小時制的小時。
  • Calendar.HOUR_OF_DAY:24 小時制的小時。
  • Calendar.MINUTE:分鐘。
  • Calendar.SECOND:秒。
  • Calendar.DAY_OF_WEEK:星期幾。

例如,要獲取當前月份可用如下代碼:
int month=Calendar.getInstance().get(Calendar.MONTH);

如果整型變量 month 的值是 0,表示當前日歷是在 1 月份;如果值是 11,則表示當前日歷在 12 月份。

使用 Calendar 類處理日期時間的實例如下:
Calendar calendar=Caiendar.getlnstance();    //如果不設置時間,則默認為當前時間
caiendar.setTimefnew Date());    //將系統當前時間賦值給 Calendar 對象
System.out.println("現在時刻:"+calendar.getTime());    //獲取當前時間
int year=calendar.get(Calendar.YEAR);    //獲取當前年份
System.out.println("現在是"+year+"年");
int month=calendar.get(Calendar.MONTH)+1;    //獲取當前月份(月份從 0 開始,所以加 1)
System.out.print(month+"月");
int day=calendar.get(Calendar.DATE);    //獲取日
System.out.print(day+"日");
int week=calendar.get(Calendar.DAY_OF_WEEK)-1;    //獲取今天星期幾(以星期日為第一天)
System.out.print("星期"+week);
int hour=calendar.get(Calendar.HOUR_OF_DAY);    //獲取當前小時數(24 小時制)
System.out.print(hour+"時");
int minute=calendar.get(Calendar.MINUTE);    //獲取當前分鐘
System.out.print(minute+"分");
int second=calendar.get(Calendar.SECOND);    //獲取當前秒數
System.out.print(second+"秒");
int millisecond=calendar.get(Calendar.MILLISECOND);    //獲取毫秒數
System.out.print(millisecond+"毫秒");
int dayOfMonth=calendar.get(Calendar.DAY_OF_MONTH);    //獲取今天是本月第幾天
System.out.println("今天是本月的第 "+dayOfMonth+" 天");
int dayOfWeekInMonth=calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);    //獲取今天是本月第幾周
System.out.println("今天是本月第 "+dayOfWeekInMonth+" 周");
int many=calendar.get(Calendar.DAY_OF_YEAR);    //獲取今天是今年第幾天
System.out.println("今天是今年第 "+many+" 天");
Calendar c=Calendar.getInstance();
c.set(2012/8/8);    //設置年月日,時分秒將默認采用當前值
System.out.println("設置日期為 2012-8-8 后的時間:"+c.getTime());    //輸出時間

上面的示例代碼演示了 Calendar 類中的方法與常量的結合使用,從而完成處理日期的操作。

例 2

下面使用 Calendar 類來實現日歷的打印功能,代碼實現如下:
import java.util.Calendar;
public class CalendarDemo
{
    public static void main(String[] args)
    {
        Calendar calendar=Calendar.getInstance();
        calendar.set(2016,5,1);    //實際的calendar對象所表示的日期為2016年6月1日

        //判斷2016年6月1日為一周中的第幾天
        int index=calendar.get(Calendar.DAY_OF_WEEK)-1;
        char[] title={'日','一','二','三','四','五','六'};    //存放曰歷的頭部
        int daysArray[][]=new int[6][7];//存放日歷的數據
        int daysInMonth=31;    //該月的天數
        int day=1;    //自動增長
        for(int i=index;i<7;i++)
        {
            //填充第一周的日期數據,即日歷中的第一行
            daysArray[0][i]=day++;
        }
        for(int i=1;i<6;i++)
        {
            //填充其他周的日歷數據,控制行
            for(int j=0;j<7;j++)
            {
                //如果當前day表示的是本月最后一天,則停止向數組中繼續賦值
                if(day>daysInMonth)
                {
                    i=6;
                    break;
                }
                daysArray[i][j]=day++;
            }
        }
        System.out.println("------------------2016 年 6 月--------------------\n");
        for(int i=0;i<title.length;i++)
        {
            System.out.print(title[i]+"\t");
        }
        System.out.print("\n");
        //輸出二元數組daysArray中的元素
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<7;j++)
            {
                if(daysArray[i][j]==0)
                {
                    if(i!=0)
                    {
                        //如果到月末,則完成顯示日歷的任務,停止該方法的執行
                        return;
                    }
                    System.out.print("\t");
                    continue;
                }
                System.out.print(daysArray[i][j]+"\t");
            }
            System.out.print("\n");
        }
    }
}

該程序看似復雜其實很簡單。因為 Calendar 類所表示的時間月份是 set() 方法中表示月份的參數值 +1,因此 Calendar 類的實際時間為 2016 年 6 月 1 日。在下面的代碼中分別獲取 6 月 1 日為本周中的第幾天,以便在相應的星期下開始輸出 6 月份的日歷。程序中的 daysArray 是一個二元數組,該二元數組控制了日歷的格式輸出,第一個子數組控制日歷的行,第二個子數組控制曰歷的列,即可輸出二元數組中的每一個元素。

運行程序,執行結果如下所示。
------------------2016 年 6 月--------------------

日 一 二 三 四 五 六
   1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户