Java 日期時間
java.util包提供了Date類來封裝當前的日期和時間。 Date對象創建以後,可以調用下面的方法。
序號 |
方法和描述 |
1 |
boolean after(Date date) 若當調用此方法的Date對象在指定日期之後返回true,否則返回false。 |
2 |
boolean before(Date date) 若當調用此方法的Date對象在指定日期之前返回true,否則返回false。 |
3 |
Object clone( ) 返回此對象的副本。 |
4 |
int compareTo(Date date) 比較當調用此方法的Date對象和指定日期。兩者相等時候返回0。調用對象在指定日期之前則返回負數。調用對象在指定日期之後則返回正數。 |
5 |
int compareTo(Object obj) 若obj是Date類型則操作等同於compareTo(Date) 。否則它拋出ClassCastException。 |
6 |
boolean equals(Object date) 當調用此方法的Date對象和指定日期相等時候返回true,否則返回false。 |
7 |
long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。 |
8 |
int hashCode( ) 返回此對象的哈希碼值。 |
9 |
void setTime(long time) 用自1970年1月1日00:00:00 GMT以後time毫秒數設置時間和日期。 |
10 |
String toString( ) 轉換Date對象爲String表示形式,並返回該字符串。 |
獲取當前日期時間
Java中獲取當前日期和時間很簡單,使用Date對象的 toString()方法來打印當前日期和時間,如下所示:
import java.util.Date;
public class DateDemo{
public static void main(String args[]){
// 初始化 Date 對象
Date date = new Date();
// 使用 toString() 函數顯示日期時間
System.out.println(date.toString());
}
}
日期比較
Java使用以下三種方法來比較兩個日期:
- 使用getTime( ) 方法獲取兩個日期(自1970年1月1日經歷的微秒數值),然後比較這兩個值。
- 使用方法before(),after()和equals()。例如,一個月的12號比18號早,則new Date(19, 2, 12).before(new Date (19, 2, 18))返回true。
- 使用compareTo()方法,它是由Comparable接口定義的,Date類實現了這個接口。
Calendar類
我們現在已經能夠格式化並創建一個日期對象了,但是我們如何才能設置和獲取日期數據的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要複雜一些。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可。
創建一個代表系統當前日期的Calendar對象
Calendar c = Calendar.getInstance();//默認是當前日期
Calendar類對象字段類型
Calendar類中用一下這些常量表示不同的意義,jdk內的很多類其實都是採用的這種思想
常量 |
描述 |
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 |
星期幾 |
Calendar類對象信息的獲得
Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(注意(這個與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);
創建一個指定日期的Calendar對象
調用:
public final void set(int year,int month,int date)
//創建一個代表2009年6月12日的Calendar對象
Calendar c1 = Calendar.getInstance();c1.set(2009, 6 - 1, 12);
使用Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後再設定該對象中的年月日參數來完成。
取得某月的最後一天
Calendar cal= Calendar.getInstance();
cal.getActualMaximum(Calendar.DAY_OF_MONTH);
取得從1970年1月1日0時0分0秒到現在的毫秒數
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
Clock.systemDefaultZone().millis(); // Java 8
利用字段類型設置
如果只設定某個字段,例如日期的值,則可以使用如下set方法:
public void set(int field,int value)
把 c1對象代表的日期設置爲10號,其它所有的數值會被重新計算
c1.set(Calendar.DATE,10);
把c1對象代表的年份設置爲2008年,其他的所有數值會被重新計算
c1.set(Calendar.YEAR,2008);
其他字段屬性set的意義以此類推
Add設置
Calendar c1 = Calendar.getInstance();
把c1對象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的數值會被重新計算
c1.add(Calendar.DATE, 10);
把c1對象的日期減去10,也就是c1所表的日期的10天前的日期,其它所有的數值會被重新計算
c1.add(Calendar.DATE, -10);
其他字段屬性的add的意義以此類推
GregorianCalendar類
Calendar類實現了公曆日曆,GregorianCalendar是Calendar類的一個具體實現。
Calendar 的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。GregorianCalendar定義了兩個字段:AD和BC。這些代表公曆定義的兩個時代。
下面列出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。 |
5 |
GregorianCalendar(Locale aLocale) 在具有給定語言環境的默認時區內構造一個基於當前時間的 GregorianCalendar。 |
6 |
GregorianCalendar(TimeZone zone) 在具有默認語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。 |
7 |
GregorianCalendar(TimeZone zone, Locale aLocale) 在具有給定語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。 |
這裏是GregorianCalendar 類提供的一些有用的方法列表:
序號 |
方法和說明 |
1 |
void add(int field, int amount) 根據日曆規則,將指定的(有符號的)時間量添加到給定的日曆字段中。 |
2 |
protected void computeFields() 轉換UTC毫秒值爲時間域值 |
3 |
protected void computeTime() 覆蓋Calendar ,轉換時間域值爲UTC毫秒值 |
4 |
boolean equals(Object obj) 比較此 GregorianCalendar 與指定的 Object。 |
5 |
int get(int field) 獲取指定字段的時間值 |
6 |
int getActualMaximum(int field) 返回當前日期,給定字段的最大值 |
7 |
int getActualMinimum(int field) 返回當前日期,給定字段的最小值 |
8 |
int getGreatestMinimum(int field) 返回此 GregorianCalendar 實例給定日曆字段的最高的最小值。 |
9 |
Date getGregorianChange() 獲得格里高利曆的更改日期。 |
10 |
int getLeastMaximum(int field) 返回此 GregorianCalendar 實例給定日曆字段的最低的最大值 |
11 |
int getMaximum(int field) 返回此 GregorianCalendar 實例的給定日曆字段的最大值。 |
12 |
Date getTime() 獲取日曆當前時間。 |
13 |
long getTimeInMillis() 獲取用長整型表示的日曆的當前時間 |
14 |
TimeZone getTimeZone() 獲取時區。 |
15 |
int getMinimum(int field) 返回給定字段的最小值。 |
16 |
int hashCode() 重寫hashCode. |
17 |
boolean isLeapYear(int year) 確定給定的年份是否爲閏年。 |
18 |
void roll(int field, boolean up) 在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。 |
19 |
void set(int field, int value) 用給定的值設置時間字段。 |
20 |
void set(int year, int month, int date) 設置年、月、日的值。 |
21 |
void set(int year, int month, int date, int hour, int minute) 設置年、月、日、小時、分鐘的值。 |
22 |
void set(int year, int month, int date, int hour, int minute, int second) 設置年、月、日、小時、分鐘、秒的值。 |
23 |
void setGregorianChange(Date date) 設置 GregorianCalendar 的更改日期。 |
24 |
void setTime(Date date) 用給定的日期設置Calendar的當前時間。 |
25 |
void setTimeInMillis(long millis) 用給定的long型毫秒數設置Calendar的當前時間。 |
26 |
void setTimeZone(TimeZone value) 用給定時區值設置當前時區。 |
27 |
String toString() 返回代表日曆的字符串。 |
實例
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
int year;
// 初始化 Gregorian 日曆
// 使用當前時間和日期
// 默認爲本地時間和時區
GregorianCalendar gcalendar = new GregorianCalendar();
// 顯示當前時間和日期的信息
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// 測試當前年份是否爲閏年
if(gcalendar.isLeapYear(year)) {
System.out.println("當前年份是閏年");
}
else {
System.out.println("當前年份不是閏年");
}
}
}
LocalDateTime類
Java 8以後我們要想獲取日期,除了Calendar 還多了新的選擇,我們可以使用java.time.LocalDateTime來獲取,代碼如下所示。
public class DateTimeTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
System.out.println(cal.get(Calendar.MINUTE));
System.out.println(cal.get(Calendar.SECOND));
// Java 8
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.getYear());
System.out.println(dt.getMonthValue()); // 1 - 12
System.out.println(dt.getDayOfMonth());
System.out.println(dt.getHour());
System.out.println(dt.getMinute());
System.out.println(dt.getSecond());
}
}
小弟水平有限,寫的有誤的地方,還請多多體諒,相互學習啊
參考: