Java中的時間日期類(Calendar、Date)


Java中操作時間日期的類有:Date(日期)、Calendar(日歷)、DateFormat(日期格式)。

一、Date

java.util.Date,表示特定的瞬間,精確到毫秒。

1、構造方法

很久以前,Date類的構造方法有:
Date(int year, int month, int date)
Date(int year, int month, int date, int hrs, int min)
Date(String s)
等等……

然而這些方法早就過時,從JDK1.1開始,就只保留了以下兩種構造方法:

  • Date()
    不用多說,new 出來的 Date 就是當前時間。

  • Date(long date)
    分配 Date 對象並初始化此對象,入參為從歷元(即 1970 年 1 月 1 日 00:00:00 GMT)以來的指定毫秒數。

2、Date類常用方法

序號 方法 描述
1 boolean after(Date date) 若當調用此方法的Date對象在指定日期之后返回true,否則返回false
2 boolean before(Date date) 若當調用此方法的Date對象在指定日期之前返回true,否則返回false
3 int compareTo(Date date) 比較當調用此方法的Date對象和指定日期。兩者相等時候返回0。調用對象在指定日期之前則返回負數。調用對象在指定日期之后則返回正數
4 boolean equals(Object date) 當調用此方法的Date對象和指定日期相等時候返回true,否則返回false
5 long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數
6 void setTime(long time) 用時間戳設置時間和日期
7 String toString() 把此 Date 對象轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)

3、日期比較

可以使用以下三種方法對兩個日期進行比較:

  • 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然后比較這兩個值

  • 使用方法 before()after()equals()。例如,一個月的12號比18號早,則:

new Date(99, 2, 12).before(new Date (99, 2, 18))    //返回true
  • 使用 compareTo() 方法,它是由 Comparable 接口定義的,Date 類實現了這個接口。

4、使用SimpleDateFormat格式化日期

Date date=new Date();
System.out.println(date);   //Sun Dec 31 15:00:08 CST 2017

SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(date));    //2017-12-31 15:00:08

format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a zzz");
System.out.println(format.format(date));    //2017-12-31 03:00:08 PM CST

5、獲取一個指定時間的Date對象

可以使用CalendargetTime()方法,返回一個表示此 Calendar 時間值(從歷元至現在的毫秒偏移量)的 Date 對象。

后面有講。

二、Calendar

我們現在已經能夠格式化並創建一個日期對象了,但是我們如何才能設置和獲取日期數據的特定部分呢,比如說小時,日,或者分鍾? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar類。

java.utiI.Calendar,是一個抽象類,
用於設置和獲取日期/時間數據的特定部分。
Calendar類提供一些方法和靜態字段來操作日歷。

1、獲取Calendar對象

Calender是抽象類,所以不能被實例化,可以使用Calendar的getInstance()方法獲取Calendar對象:

Calendar calendar = Calendar.getInstance();    //默認是當前日期

2、Calendar常用方法

序號 方法 描述
1 int get(int field) 返回給定日歷字段的值,參數為常量,可以得到:年、月、日、小時、分鍾、星期幾
2 void set(int year, int month, int date) 設置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
3 void set(int year, int month, int date, int hourOfDay, int minute) 設置日歷字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值
4 void set(int year, int month, int date, int hourOfDay, int minute, int second) 設置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值
5 void setTime(Date date) 使用給定的 Date 設置此 Calendar 的時間
6 Date getTime() 返回一個表示此 Calendar 時間值的 Date 對象
7 void add(int field, int amount) 根據日歷的規則,為給定的日歷字段添加或減去指定的時間量
8 int getActualMaximum(int field) 返回當前月份的天數,參數為Calendar.DATE

2.1 Calendar常量

常量 描述
Calendar.YEAR
Calendar.MONTH
Calendar.DAY_OF_MONTH
Calendar.DATE 日,和Calendar.DAY_OF_MONTH完全相同
Calendar.HOUR 小時(12小時制)
Calendar.HOUR_OF_DAY 小時(24小時制)
Calendar.MINUTE 分鍾
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期幾

注意:
月+1,周-1.

西方表示的月和我們有些不一樣,第一個月用的是0表示,要獲得准確的月就要+1;
星期幾的話,一周的第一天應該是星期日,因此1代表星期日、2代表星期1、3代表星期二…
如果想將1表示為星期一的話,那么周就需要-1.

3、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);
int hour=calendar.get(Calendar.HOUR_OF_DAY);
int minute=calendar.get(Calendar.MINUTE);
int second=calendar.get(Calendar.SECOND);
int week=calendar.get(Calendar.DAY_OF_WEEK)-1;

System.out.println("現在是:"+year+"年"+month+"月"+day+"日 "+hour+":"+minute+":"+second+" 星期"+week);
//現在是:2017年12月31日 15:57:39 星期0
//-1之后,0表示星期日

4、給Calendar對象設置指定日期

Calendar calendar=Calendar.getInstance();
//設置為:2017年10月1日 22:59:59
//在設置時間是,月要-1
calendar.set(2017,10-1,1,22,59,59);

5、使用add()方法修改時間

//今天
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);
int week=calendar.get(Calendar.DAY_OF_WEEK)-1;
String[] currentDay={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

System.out.println("今天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]);    //今天是:2017年12月31日 星期日

//1天后
calendar.add(Calendar.DAY_OF_MONTH,+1);     //往后推移一天

year=calendar.get(Calendar.YEAR);
month=calendar.get(Calendar.MONTH)+1;
day=calendar.get(Calendar.DAY_OF_MONTH);
week=calendar.get(Calendar.DAY_OF_WEEK)-1;
System.out.println("明天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]);    //明天是:2018年1月1日 星期一

6、獲取當月的天數

Calendar calendar=Calendar.getInstance();

int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;

System.out.println("今天是:"+year+"年"+month+"月");
System.out.println("本月一共有"+calendar.getActualMaximum(Calendar.DAY_OF_MONTH)+"天");

三、GregorianCalendar類

Calendar類實現了公歷日歷,GregorianCalendar是Calendar類的一個具體實現。

CalendargetInstance()方法,返回的就是一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。

1、GregorianCalendar類常用構造方法

序號 方法 描述
1 GregorianCalendar() 在具有默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar
2 GregorianCalendar(int year, int month, int date) 創建指定日期的GregorianCalendar
3 GregorianCalendar(int year, int month, int date, int hour, int minute) 創建指定日期的GregorianCalendar
4 GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 創建指定日期的GregorianCalendar

2、GregorianCalendar類常用方法

2、Calendar常用方法基本一致,畢竟是其實現類。

但還有個特有方法:boolean isLeapYear(int year),確定給定的年份是否為閏年。

因此不要向上轉型,否則不能調用特有方法。

3、確定當年是否為閏年

//首先不能向上轉型,這里要使用實現類GregorianCalendar作為引用
GregorianCalendar calendar=new GregorianCalendar(2024,10-1,1);

int year=calendar.get(Calendar.YEAR);

boolean isLeapYear=calendar.isLeapYear(year);
if(isLeapYear) System.out.println("當前年份是閏年");
else System.out.println("當前年份是平年");

四、Date、String、Calendar類型之間的轉化

1、Date 轉 Calendar

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());

2、Calendar 轉 Date

Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();

3、Date 轉 String

這個沒什么好說的,SimpleDateFormat格式化。

4、String 轉 Date

使用SimpleDateFormat類的parse(String str)方法將字符串轉為Date.

String str="2010-5-27";
SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(str);

5、Calendar 轉 String

兩種方法:

  • 使用Calendar.get()方法取到年月日信息,然后+"";
  • Calendar.getTime()拿到Date對象,然后SimpleDateFormat格式化。

6、String 轉 Calendar

先使用SimpleDateFormat.parse(String str)方法將字符串轉為Date類型,然后使用Calendar.setTime(Date date)方法。

五、計算兩個日期相差了多少天

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
try {
    Date $start=simpleDateFormat.parse("2017-1-1");
    Date $end=simpleDateFormat.parse("2019-1-1");

    Calendar start=Calendar.getInstance();
    Calendar end=Calendar.getInstance();
    start.setTime($start);
    end.setTime($end);
    int day = end.get(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR);
    int resultYear=(end.get(Calendar.YEAR) - start.get(Calendar.YEAR))*365;
    int result=day+resultYear;

    System.out.println("相差"+result+"天");

} catch (ParseException e) {
    e.printStackTrace();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM