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對象
可以使用Calendar的getTime()方法,返回一個表示此 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類的一個具體實現。
Calendar的getInstance()方法,返回的就是一個默認用當前的語言環境和時區初始化的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();
}
