
Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境設定
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重catch塊
- Java - 巢狀try塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 合併執行緒
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - Socket 程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多發行版 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾收集
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API 改進
- Java - Stream API 改進
- Java - 增強型 @Deprecated 註解
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 日期和時間
Java 提供了可在 java.util 包 中使用的 Date 類,此類封裝了當前日期和時間。
Date 類支援如下表所示的兩個建構函式。
序號 | 建構函式和描述 |
---|---|
1 | Date( ) 此建構函式使用當前日期和時間初始化物件。 |
2 | Date(long millisec) 此建構函式接受一個引數,該引數等於自 1970 年 1 月 1 日午夜以來的毫秒數。 |
以下是 Date 類的其他方法。
序號 | 方法和描述 |
---|---|
1 | boolean after(Date when)
此方法測試此日期是否在指定日期之後。 |
2 | boolean before(Date when)
此方法測試此日期是否在指定日期之前。 |
3 | Object clone()
此方法返回此物件的副本。 |
4 | int compareTo(Date anotherDate)
此方法比較兩個 Date 的順序。 |
5 | boolean equals(Object obj)
此方法比較兩個日期是否相等。 |
6 | static Date from(Instant instant)
此方法從 Instant 物件獲取 Date 例項。 |
7 | long getTime()
此方法返回自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數,由此 Date 物件表示。 |
8 | int hashCode()
此方法返回此物件的雜湊碼值。 |
9 | void setTime(long time)
此方法設定此 Date 物件以表示自 1970 年 1 月 1 日 00:00:00 GMT 以來 time 毫秒的時刻。 |
10 | Instant toInstant()
此方法將此 Date 物件轉換為 Instant。 |
11 | String toString()
此方法將此 Date 物件轉換為以下形式的字串。 |
獲取當前日期和時間
這是一種在 Java 中獲取當前日期和時間非常簡單的方法。可以使用帶有 toString() 方法的簡單 Date 物件來列印當前日期和時間,如下所示:
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toString() System.out.println(date.toString()); } }
這將產生以下結果:
輸出
on May 04 09:51:52 CDT 2009
日期比較
以下是比較兩個日期的三種方法:
可以使用 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 ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } }
這將產生以下結果:
輸出
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
SimpleDateFormat 格式程式碼
要指定時間格式,請使用時間模式字串。在此模式中,所有 ASCII 字母都保留為模式字母,定義如下:
字元 | 描述 | 示例 |
---|---|---|
G | 紀元指示符 | 公元 |
y | 四位數年份 | 2001 |
M | 月份 | 七月或 07 |
d | 日 | 10 |
h | 小時 (1~12) | 12 |
H | 小時 (0~23) | 22 |
m | 分鐘 | 30 |
s | 秒 | 55 |
S | 毫秒 | 234 |
E | 星期幾 | 星期二 |
D | 一年中的第幾天 | 360 |
F | 一個月中的星期幾 | 2 (七月的第二個星期三) |
w | 一年中的第幾周 | 40 |
W | 一個月中的第幾周 | 1 |
a | 上午/下午標記 | 下午 |
k | 小時 (1~24) | 24 |
K | 小時 (0~11) | 10 |
z | 時區 | 東部標準時間 |
' | 轉義文字 | 分隔符 |
" | 單引號 | ` |
使用 printf 進行日期格式化
可以使用 printf 方法非常輕鬆地進行日期和時間格式化。可以使用以 t 開頭並以表格中的一個字母結尾的兩個字母格式,如下面的程式碼所示。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date String str = String.format("Current Date/Time : %tc", date ); System.out.printf(str); } }
這將產生以下結果:
輸出
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
如果必須多次提供日期來格式化每個部分,那就有點愚蠢了。因此,格式字串可以指示要格式化的引數的索引。
索引必須緊跟在 % 之後,並且必須以 $ 結尾。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } }
這將產生以下結果:
輸出
Due date: February 09, 2004
或者,可以使用 < 標誌。它指示應再次使用與前面格式規範相同的引數。
示例
import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display formatted date System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
這將產生以下結果:
輸出
Due date: February 09, 2004
日期和時間轉換字元
字元 | 描述 | 示例 |
---|---|---|
c | 完整的日期和時間 | 2009年5月4日星期一 09:51:52 CDT |
F | ISO 8601 日期格式 | 2004-02-09 |
D | 美國日期格式 (月/日/年) | 02/09/2004 |
T | 24小時制時間 | 18:05:19 |
r | 12小時制時間 | 下午06:05:19 |
R | 24小時制時間,無秒 | 18:05 |
Y | 四位數年份(帶前導零) | 2004 |
y | 年份的後兩位數(帶前導零) | 04 |
C | 年份的前兩位數(帶前導零) | 20 |
B | 月份全稱 | 二月 |
b | 月份縮寫 | Feb |
m | 兩位數月份(帶前導零) | 02 |
d | 兩位數日期(帶前導零) | 03 |
e | 兩位數日期(無前導零) | 9 |
A | 星期幾全稱 | 星期一 |
a | 星期幾縮寫 | Mon |
j | 三位數一年中的第幾天(帶前導零) | 069 |
H | 兩位數小時(帶前導零),介於00和23之間 | 18 |
k | 兩位數小時(無前導零),介於0和23之間 | 18 |
I | 兩位數小時(帶前導零),介於01和12之間 | 06 |
l | 兩位數小時(無前導零),介於1和12之間 | 6 |
M | 兩位數分鐘(帶前導零) | 05 |
S | 兩位數秒(帶前導零) | 19 |
L | 三位數毫秒(帶前導零) | 047 |
N | 九位數納秒(帶前導零) | 047000000 |
P | 上午或下午標記(大寫) | 下午 |
p | 上午或下午標記(小寫) | pm |
z | RFC 822 格林尼治標準時間數值偏移 | -0800 |
Z | 時區 | PST |
s | 自1970-01-01 00:00:00 GMT以來的秒數 | 1078884319 |
Q | 自1970-01-01 00:00:00 GMT以來的毫秒數 | 1078884319047 |
還有其他與日期和時間相關的有用類。更多詳情,請參考Java標準文件。
將字串解析為日期
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 EST 1818
暫停一段時間
您可以暫停從一毫秒到計算機壽命的任何時間段。例如,以下程式將暫停3秒:
示例
import java.util.*; public class SleepDemo { public static void main(String args[]) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } }
這將產生以下結果:
輸出
Sun May 03 18:04:41 GMT 2009 Sun May 03 18:04:51 GMT 2009
測量經過時間
有時,您可能需要以毫秒為單位測量某個時間點。因此,讓我們再次改寫上面的示例:
示例
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!"); } } }
這將產生以下結果:
輸出
Sun May 03 18:16:51 GMT 2009 Sun May 03 18:16:57 GMT 2009 Difference is : 5993
GregorianCalendar 類
GregorianCalendar 是 Calendar 類的具體實現,它實現了您熟悉的普通格里高利曆。本教程中未討論 Calendar 類,您可以查詢標準 Java 文件。
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 與物件引用。 |
5 | int get(int field) 獲取給定時間欄位的值。 |
6 | int getActualMaximum(int field) 返回給定當前日期時此欄位可能具有的最大值。 |
7 | int getActualMinimum(int field) 返回給定當前日期時此欄位可能具有的最小值。 |
8 | int getGreatestMinimum(int field) 如果變化,則返回給定欄位的最高最小值。 |
9 | Date getGregorianChange() 獲取格里高利曆更改日期。 |
10 | int getLeastMaximum(int field) 如果變化,則返回給定欄位的最低最大值。 |
11 | int getMaximum(int field) 返回給定欄位的最大值。 |
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) 設定格里高利曆更改日期。 |
24 | void setTime(Date date) 使用給定的日期設定此日曆的當前時間。 |
25 | void setTimeInMillis(long millis) 使用給定的長整型值設定此日曆的當前時間。 |
26 | void setTimeZone(TimeZone value) 使用給定的時區值設定時區。 |
27 | String toString() 返回此日曆的字串表示形式。 |
示例
import 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; // Create a Gregorian calendar initialized // with the current date and time in the // default locale and timezone. GregorianCalendar gcalendar = new GregorianCalendar(); // Display current time and date information. 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)); // Test if the current year is a leap year if(gcalendar.isLeapYear(year)) { System.out.println("The current year is a leap year"); }else { System.out.println("The current year is not a leap year"); } } }
這將產生以下結果:
輸出
Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
有關 Calendar 類中可用常量的完整列表,請參閱標準 Java 文件。