Java中Date日期時間類具體使用
java.util 包提供瞭 Date 類來封裝當前的日期和時間。 Date 類提供兩個構造函數來實例化 Date 對象。
第一個構造函數使用當前日期和時間來初始化對象:
Date( )
第二個構造函數接收一個參數,該參數是從 1970 年 1 月 1 日起的毫秒數。
Date(long millisec)
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: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
例如獲取當前日期時間並打印:
import java.util.Date; public class DateDemo { public static void main(String[] args) { // 初始化 Date 對象 Date date = new Date(); // 使用 toString() 函數顯示日期時間 System.out.println(date.toString()); } } // 實例編譯運行結果如下: // Tue Apr 04 22:50:40 CST 2023
日期比較
Java使用以下三種方法來比較兩個日期:
- 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然後比較這兩個值。
- 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
- 使用 compareTo() 方法,它是由 Comparable 接口定義的,Date 類實現瞭這個接口。
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何用戶自定義日期時間格式來運行。例如:
import java.util.*; import java.text.*; public class DateDemo { public static void main(String[] args) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); System.out.println("當前時間為: " + ft.format(dNow)); } } // 實例編譯運行結果如下: // 當前時間為: 2023-04-04 10:55:24
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); 這一行代碼確立瞭轉換的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是時、分、秒。註意:有的格式大寫,有的格式小寫,例如 MM 是月份,mm 是分;HH 是 24 小時制,而 hh 是 12 小時制。
日期和時間的格式化編碼
時間模式字符串用來指定時間格式。在此模式中,所有的 ASCII 字母被保留為模式字母,定義如下:
字母 | 描述 | 示例 |
---|---|---|
G | 紀元標記 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一個月的日期 | 10 |
h | A.M./P.M. (1~12)格式小時 | 12 |
H | 一天中的小時 (0~23) | 22 |
m | 分鐘數 | 30 |
s | 秒數 | 55 |
S | 毫秒數 | 234 |
E | 星期幾 | Tuesday |
D | 一年中的日子 | 360 |
F | 一個月中第幾周的周幾 | 2 (second Wed. in July) |
w | 一年中第幾周 | 40 |
W | 一個月中第幾周 | 1 |
a | A.M./P.M. 標記 | PM |
k | 一天中的小時(1~24) | 24 |
K | A.M./P.M. (0~11)格式小時 | 10 |
z | 時區 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 單引號 | ` |
使用printf格式化日期
printf 方法可以很輕松地格式化時間和日期。使用兩個字母格式,它以 %t 開頭並且以下面表格中的一個字母結尾。
- %tY:輸出四位數的年份,例如:2023
- %ty:輸出兩位數的年份,例如:23
- %tm:輸出兩位數的月份,例如:02
- %tB:輸出月份的全名,例如:February
- %tb:輸出月份的縮寫,例如:Feb
- %tA:輸出星期的全名,例如:Wednesday
- %ta:輸出星期的縮寫,例如:Wed
- %td:輸出兩位數的日期,例如:24
- %te:輸出一位或兩位數的日期,例如:24 或 02
- %tH:輸出24小時制的小時數,例如:23
- %tI:輸出12小時制的小時數,例如:11
- %tM:輸出分鐘數,例如:45
- %tS:輸出秒數,例如:30
- %tp:輸出上午還是下午,例如:AM 或 PM
- %tZ:輸出時區,例如:GMT+08:00
轉換符 | 說明 | 示例 |
---|---|---|
%tc | 包括全部日期和時間信息 | 星期六 十月 27 14:21:20 CST 2007 |
%tF | "年-月-日"格式 | 2007-10-27 |
%tD | "月/日/年"格式 | 10/27/07 |
%tr | "HH:MM:SS PM"格式(12時制) | 02:25:51 下午 |
%tT | "HH:MM:SS"格式(24時制) | 14:28:16 |
%tR | "HH:MM"格式(24時制) | 14:28 |
printf格式化日期實例:
格式化日期:
import java.util.Date; public class DateFormatExample { public static void main(String[] args) { Date date = new Date(); System.out.printf("%tY-%tm-%td %tH:%tM:%tS %tZ", date, date, date, date, date, date, date); } } // 執行輸出結果為: // 2023-04-05 09:59:23 CST
使用轉換符格式化日期:
import java.util.Date; public class DateDemo { public static void main(String[] args) { // 初始化 Date 對象 Date date = new Date(); //c的使用 System.out.printf("全部日期和時間信息:%tc%n",date); //f的使用 System.out.printf("年-月-日格式:%tF%n",date); //d的使用 System.out.printf("月/日/年格式:%tD%n",date); //r的使用 System.out.printf("HH:MM:SS PM格式(12時制):%tr%n",date); //t的使用 System.out.printf("HH:MM:SS格式(24時制):%tT%n",date); //R的使用 System.out.printf("HH:MM格式(24時制):%tR",date); } } // 實例編譯運行結果如下: // 全部日期和時間信息:星期三 四月 05 10:06:21 CST 2023 // 年-月-日格式:2023-04-05 // 月/日/年格式:04/05/23 // HH:MM:SS PM格式(12時制):10:06:21 上午 // HH:MM:SS格式(24時制):10:06:21 // HH:MM格式(24時制):10:06
如果你需要重復提供日期,那麼利用這種方式來格式化它的每一部分就有點復雜瞭。因此,可以利用一個格式化字符串指出要被格式化的參數的索引。索引必須緊跟在 % 後面,而且必須以 $ 結束。例如:
import java.util.Date; public class DateDemo { public static void main(String[] args) { // 初始化 Date 對象 Date date = new Date(); // 使用toString()顯示日期和時間 // %1$索引指向 "Due date:" // %2$索引指向 date System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } } // 實例編譯運行結果如下: // Due date: 四月 05, 2023
或者,你可以使用 < 標志。它表明先前被格式化的參數要被再次使用。例如:
import java.util.Date; public class DateDemo { public static void main(String[] args) { // 初始化 Date 對象 Date date = new Date(); // 顯示格式化時間 System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } } // 實例編譯運行結果如下: // Due date: 四月 5, 2023
定義日期格式的轉換符可以使日期通過指定的轉換符生成新字符串。這些日期轉換符如下所示:
import java.util.*; public class DateDemo { public static void main(String[] args) { Date date=new Date(); //b的使用,月份簡稱 String str=String.format(Locale.US,"英文月份簡稱:%tb",date); System.out.println(str); System.out.printf("本地月份簡稱:%tb%n",date); //B的使用,月份全稱 str=String.format(Locale.US,"英文月份全稱:%tB",date); System.out.println(str); System.out.printf("本地月份全稱:%tB%n",date); //a的使用,星期簡稱 str=String.format(Locale.US,"英文星期的簡稱:%ta",date); System.out.println(str); //A的使用,星期全稱 System.out.printf("本地星期的簡稱:%tA%n",date); //C的使用,年前兩位 System.out.printf("年的前兩位數字(不足兩位前面補0):%tC%n",date); //y的使用,年後兩位 System.out.printf("年的後兩位數字(不足兩位前面補0):%ty%n",date); //j的使用,一年的天數 System.out.printf("一年中的天數(即年的第幾天):%tj%n",date); //m的使用,月份 System.out.printf("兩位數字的月份(不足兩位前面補0):%tm%n",date); //d的使用,日(二位,不夠補零) System.out.printf("兩位數字的日(不足兩位前面補0):%td%n",date); //e的使用,日(一位不補零) System.out.printf("月份的日(前面不補0):%te",date); } } // 輸出結果為: // 英文月份簡稱:Apr // 本地月份簡稱:四月 // 英文月份全稱:April // 本地月份全稱:四月 // 英文星期的簡稱:Wed // 本地星期的簡稱:星期三 // 年的前兩位數字(不足兩位前面補0):20 // 年的後兩位數字(不足兩位前面補0):23 // 一年中的天數(即年的第幾天):095 // 兩位數字的月份(不足兩位前面補0):04 // 兩位數字的日(不足兩位前面補0):05 // 月份的日(前面不補0):5
解析字符串為時間
SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:
import java.util.*; import java.text.*; public class DateDemo { public static void main(String[] args) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } } // 實例編譯運行結果如下: // 1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818
休眠(sleep)
sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CPU的使用、目的是不讓當前線程獨自霸占該進程所獲的CPU資源,以留一定時間給其他線程執行的機會。你可以讓程序休眠一毫秒的時間或者到您的計算機的壽命長的任意段時間。例如,下面的程序會休眠3秒:
import java.util.*; public class SleepDemo { public static void main(String[] args) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(1000*3); // 休眠3秒 System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } } // 實例編譯運行結果如下: // Thu Apr 06 11:18:56 CST 2023 // Thu Apr 06 11:18:59 CST 2023
測量時間間隔(以毫秒為單位)的實例:\color{red}{測量時間間隔(以毫秒為單位)的實例 :}測量時間間隔(以毫秒為單位)的實例:
import java.util.*; public class DiffDemo { public static void main(String[] args) { try { long start = System.currentTimeMillis( ); System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); long end = System.currentTimeMillis( ); long diff = end - start; System.out.println("Difference is : " + diff); } catch (Exception e) { System.out.println("Got an exception!"); } } } // 實例編譯運行結果如下: // Thu Apr 06 11:25:14 CST 2023 // Thu Apr 06 11:25:17 CST 2023 // Difference is : 3038
Calendar類
我們現在已經能夠格式化並創建一個日期對象瞭,但是我們如何才能設置和獲取日期數據的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強大很多,但在實現方式上也比Date類要復雜一些。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,隻需要使用getInstance方法創建即可。例如創建一個代表系統當前日期的Calendar對象:
Calendar c = Calendar.getInstance();//默認是當前日期
或者創建一個指定日期的Calendar對象(註:Calendar 的月份是從 0 開始的):
//創建一個代表2009年6月12日的Calendar對象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
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類對象信息的設置
set設置:
調用 public final void set(int year,int month,int date) 方法。例如:
Calendar c1 = Calendar.getInstance(); c1.set(2009, 6, 12);//把Calendar對象c1的年月日分別設這為:2009、6、12
如果隻設定某個字段,例如日期的值,則可以使用 public void set(int field,int value) 方法。例如,把 c1對象代表的日期設置為10號,其他的所有數值會被重新計算:
Calendar c1 = Calendar.getInstance(); c1.set(Calendar.DATE,10);
其他字段屬性set的意義以此類推。
add設置:
把c1對象的日期加上10,也就是c1也就表示為10天後的日期,其它所有的數值會被重新計算:
Calendar c1 = Calendar.getInstance(); c1.add(Calendar.DATE, 10);
把c1對象的日期減去10,也就是c1也就表示為10天前的日期,其它所有的數值會被重新計算:
Calendar c1 = Calendar.getInstance(); c1.add(Calendar.DATE, -10);
其他字段屬性的add的意義以此類推。
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);
GregorianCalendar類
Calendar類實現瞭公歷日歷,GregorianCalendar是Calendar類的一個具體實現。Calendar 的getInstance()方法返回一個默認用當前的語言環境和時區初始化的GregorianCalendar對象。GregorianCalendar定義瞭兩個字段:AD和BC。這是代表公歷定義的兩個時代。
下面列出GregorianCalendar對象的幾個構造方法:
- GregorianCalendar() —— 在具有默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar。
- GregorianCalendar(int year, int month, int date) —— 在具有默認語言環境的默認時區內構造一個帶有給定日期設置的 GregorianCalendar。
- GregorianCalendar(int year, int month, int date, int hour, int minute) —— 為具有默認語言環境的默認時區構造一個具有給定日期和時間設置的 GregorianCalendar。
- GregorianCalendar(int year, int month, int date, int hour, int minute, int second) —— 為具有默認語言環境的默認時區構造一個具有給定日期和時間設置的 GregorianCalendar。
- GregorianCalendar(Locale aLocale) —— 在具有給定語言環境的默認時區內構造一個基於當前時間的 GregorianCalendar。
- GregorianCalendar(TimeZone zone) —— 在具有默認語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。
- GregorianCalendar(TimeZone zone, Locale aLocale) —— 在具有給定語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar。
這裡是GregorianCalendar 類提供的一些嘗用的方法列表:
- void add(int field, int amount) —— 根據日歷規則,將指定的(有符號的)時間量添加到給定的日歷字段中。
- protected void computeFields() —— 轉換UTC毫秒值為時間域值。
- protected void computeTime() —— 覆蓋Calendar ,轉換時間域值為UTC毫秒值。
- boolean equals(Object obj) —— 比較此 GregorianCalendar 與指定的 Object。
- int get(int field) —— 獲取指定字段的時間值。
- int getActualMaximum(int field) —— 返回當前日期,給定字段的最大值。
- int getActualMinimum(int field) —— 返回當前日期,給定字段的最小值。
- int getGreatestMinimum(int field) —— 返回此 GregorianCalendar 實例給定日歷字段的最高的最小值。
- Date getGregorianChange() —— 獲得格裡高利歷的更改日期。
- int getLeastMaximum(int field) —— 返回此 GregorianCalendar 實例給定日歷字段的最低的最大值。
- int getMaximum(int field) —— 返回此 GregorianCalendar 實例的給定日歷字段的最大值。
- Date getTime() —— 獲取日歷當前時間。
- long getTimeInMillis() —— 獲取用長整型表示的日歷的當前時間。
- TimeZone getTimeZone() —— 獲取時區。
- int getMinimum(int field) —— 返回給定字段的最小值。
- int hashCode() —— 重寫hashCode。
- boolean isLeapYear(int year) —— 確定給定的年份是否為閏年。
- void roll(int field, boolean up) —— 在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。
- void set(int field, int value) —— 用給定的值設置時間字段。
- void set(int year, int month, int date) —— 設置年、月、日的值。
- void set(int year, int month, int date, int hour, int minute) —— 設置年、月、日、小時、分鐘的值。
- void set(int year, int month, int date, int hour, int minute, int second) —— 設置年、月、日、小時、分鐘、秒的值。
- void setGregorianChange(Date date) —— 設置 GregorianCalendar 的更改日期。
- void setTime(Date date) —— 用給定的日期設置Calendar的當前時間。
- void setTimeInMillis(long millis) —— 用給定的long型毫秒數設置Calendar的當前時間。
- void setTimeZone(TimeZone value) —— 用給定時區值設置當前時區。
- String toString() —— 返回代表日歷的字符串。
GregorianCalendar 使用實例:
mport java.util.*; 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("當前年份不是閏年"); } } } // 實例編譯運行結果如下: // Date: Apr 6 2023 // Time: 3:35:13 // 當前年份不是閏年
方法實例:\color{red}{方法實例:}方法實例:
時間戳轉換成時間:
public class Test { public static void main(String args[]) { // 獲取當前時間戳 Long timeStamp = System.currentTimeMillis(); // 時間格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 時間戳轉換成時間 String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); System.out.println("格式化結果:" + sd); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"); String sd2 = sdf2.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); System.out.println("格式化結果:" + sd2); } } // 實例編譯運行結果如下: // 格式化結果:2023-04-23 14:24:13 // 格式化結果:2023 年 04 月 23 日 14 時 24 分 13 秒
到此這篇關於Java中Date日期時間類具體使用的文章就介紹到這瞭,更多相關Java Date日期時間類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 新手小白學JAVA 日期類Date SimpleDateFormat Calendar(入門)
- Java常用類之日期相關類使用詳解
- Java日期時間類(Date、DateFormat、Calendar)解析
- JavaSE系列基礎包裝類及日歷類詳解
- java Date和SimpleDateFormat時間類詳解