日期類
第一代日期類:Date
引入包
import java.text.ParseException
:日期轉換可能會拋出轉換異常 import java.util.Date
1. 基本介紹
2. Date 格式化的參數表
3. 方法介紹
(1)Date
(2)SimpleDateFormat
創建該對象,傳入格式化的字符串(yyyy 年 MM 月 dd 日 hh:mm:ss E
) parse
方法:字符串轉日期 注意點 (1)輸出時會按照國外的形式輸出,如果希望指定格式輸出,需要使用format
方法格式化
代碼示例
import java. text. ParseException ;
import java. text. SimpleDateFormat ;
import java. util. Date ; public class main { public static void main ( String [ ] args) throws ParseException { Date date = new Date ( ) ; System . out. println ( "date:" + date) ; Date date1 = new Date ( 89875 ) ; System . out. println ( "date1:" + date1) ; SimpleDateFormat sf = new SimpleDateFormat ( "yyyy 年 MM 月 dd 日 hh:mm:ss E" ) ; String format_date = sf. format ( date) ; System . out. println ( "Formatted date: " + format_date) ; String s = "1996 年 01 月 01 日 10:20:30 星期一" ; Date String_to_Date = sf. parse ( s) ; System . out. println ( "parse = " + sf. format ( String_to_Date ) ) ; }
}
date:Sun Jun 08 17 : 51 : 23 CST 2025
date1:Thu Jan 01 08 : 01 : 29 CST 1970
Formatted date: 2025 年 06 月 08 日 05 : 51 : 23 星期日
parse = 1996 年 01 月 01 日 10 : 20 : 30 星期一
二、第二代日期類:Calendar
引入包:java.util.Calendar
基本介紹
Calendar
類是一個抽象類 ,構造器是private
,即不可以創建該對象 ,通過getinstance()
方法來獲取該對象實例 注意 :Calendar
類沒有專門的日期格式化方法,需要自己通過獲取字段,用組合的方式實現日期格式化 (使用get()
方法)
常用字段
字段 描述 YEAR 年份 MONTH 月份(0-11) 從 0 開始編號 DAY_OF_MONTH 當前月的天數 HOUR 當前小時(0-23) MINUTE 當前分鐘(0-59) SECOND 當前秒數(0-59) DAY_OF_WEEK 一周中的某一天(1-7,1 代表星期天) WEEK_OF_YEAR 一年的第幾周 WEEK_OF_MONTH 當前月的第幾周 AM_PM 上午或下午(0 為上午 ,1 為下午 )
獲取當前時間:getTime()
方法
Calendar date = Calendar . getInstance ( ) ;
System . out. println ( "日期:" + date. getTime ( ) ) ;
代碼示例
package arrays ; import java. util. Calendar ; public class main { public static void main ( String [ ] args) { Calendar date = Calendar . getInstance ( ) ; System . out. println ( "=====輸出當前日期時間=====" ) ; System . out. println ( "日期:" + date. getTime ( ) ) ; System . out. println ( ) ; System . out. println ( "=====輸出年、月、日、時、分、秒等信息=====" ) ; System . out. println ( "年:" + date. get ( Calendar . YEAR ) ) ; System . out. println ( "月:" + ( date. get ( Calendar . MONTH ) + 1 ) ) ; System . out. println ( "日:" + date. get ( Calendar . DAY_OF_MONTH ) ) ; System . out. println ( "小時:" + date. get ( Calendar . HOUR_OF_DAY ) ) ; System . out. println ( "分鐘:" + date. get ( Calendar . MINUTE ) ) ; System . out. println ( "秒:" + date. get ( Calendar . SECOND ) ) ; System . out. println ( ) ; System . out. println ( "=====拼接年月日時分秒=====" ) ; String currentDateTime = date. get ( Calendar . YEAR ) + "年" + ( date. get ( Calendar . MONTH ) + 1 ) + "月" + date. get ( Calendar . DAY_OF_MONTH ) + "日 " + date. get ( Calendar . HOUR_OF_DAY ) + ":" + date. get ( Calendar . MINUTE ) + ":" + date. get ( Calendar . SECOND ) ; System . out. println ( "當前時間:" + currentDateTime) ; System . out. println ( ) ; System . out. println ( "=====輸出一周中的某一天、周數等=====" ) ; System . out. println ( "星期幾:" + date. get ( Calendar . DAY_OF_WEEK ) ) ; System . out. println ( "一年中的第幾周:" + date. get ( Calendar . WEEK_OF_YEAR ) ) ; System . out. println ( "當前月的第幾周:" + date. get ( Calendar . WEEK_OF_MONTH ) ) ; System . out. println ( ) ; System . out. println ( "=====輸出上午下午信息=====" ) ; System . out. println ( "上午 / 下午:" + ( date. get ( Calendar . AM_PM ) ) ) ; }
}
== == = 輸出當前日期時間== == =
日期:Sun Jun 08 18 : 14 : 53 CST 2025 == == = 輸出年、月、日、時、分、秒等信息== == =
年:2025
月:6
日:8
小時:18
分鐘:14
秒:53 == == = 拼接年月日時分秒== == =
當前時間:2025 年6 月8 日 18 : 14 : 53 == == = 輸出一周中的某一天、周數等== == =
星期幾:1
一年中的第幾周:24
當前月的第幾周:2 == == = 輸出上午下午信息== == =
上午 / 下午:1
三、第三代日期類
引入包
java.time.LocalDateTime
java.time.LocalTime
1. 引言
前面兩代 日期類的不足 分析
JDK 1.0 中包含了一個 java.util.Date 類,但是它的大多數方法已經在 JDK 1.1 引入 Calendar 類之后被棄用了。而Calendar
也存在問題 是:
(1) 可變性 :像日期和時間這種類別應該是不可變的。 (3) 格式化 :格式化只對Date
有效,Calendar
則不行。
2. 常用類
(1)時間的表示
LocalDate
:用于表示沒有時間部分的日期(年、月、日)。例如:2025-06-08。 LocalDateTime
: 用于表示日期和時間。可以精確到秒或納秒。例如:2025-06-08T17:30:00。
補充:時間的創建
方法名 描述 LocalTime.of(hour, minute)
創建一個表示特定時間的 LocalTime
對象(包含小時、分鐘)。 LocalTime.of(hour, minute, second)
創建一個表示特定時間的 LocalTime
對象(包含小時、分鐘和秒)。 LocalTime.of(hour, minute, second, nanoOfSecond)
創建一個表示特定時間的 LocalTime
對象(包含小時、分鐘、秒和納秒)。
(2)日期的計算
適用于LocalDate
、LocalTime
、LocalDateTime
方法 解釋 plusDays(long daysToAdd)
將指定的天數加到當前日期(LocalDate
、LocalDateTime
)。 minusDays(long daysToSubtract)
從當前日期(LocalDate
、LocalDateTime
)中減去指定的天數。 plusMonths(long monthsToAdd)
將指定的月數加到當前日期(LocalDate
、LocalDateTime
)。 minusMonths(long monthsToSubtract)
從當前日期(LocalDate
、LocalDateTime
)中減去指定的月數。 plusYears(long yearsToAdd)
將指定的年數加到當前日期(LocalDate
、LocalDateTime
)。 minusYears(long yearsToSubtract)
從當前日期(LocalDate
、LocalDateTime
)中減去指定的年數。
補充類
Period
: 常用 于計算兩個日期之間 的差異 年:getYears()
方法 日:getDays()
方法 時:toHours()
方法 秒:getSeconds()
方法
關于between()
方法傳參問題 的說明
(1)Period.between()
方法
方法名 傳入參數類型 適用情況 說明 Period.between()
LocalDate
用于計算日期差(年、月、日) 只能用于 LocalDate
類型的日期之間的差異。無法處理時間差(時、分、秒)。
(2)Duration.between()
方法
方法名 傳入參數類型 適用情況 說明 Duration.between()
Temporal
(如 LocalTime
, LocalDateTime
, Instant
)用于計算時間差(時、分、秒) Temporal
是一個接口,LocalTime
、LocalDateTime
和 Instant
實現了此接口,可以用于計算這三者之間的時間差。
(3)日期的格式化 :DateTimeFormatter
類(不可變且線程安全的類 )
(4)時間戳
Instant
: 用于表示時間戳 ,通常與 UTC 時間一起使用,精確到納秒。例如:2025-06-08T09:30:00Z。 toInstant()
方法:Date
轉Instant
3. get...()
方法整理
注意:java.time
類庫中的 get()
方法返回的是真實數據 ,并且不會從 0 開始編號
方法 描述 年月日相關 getYear()
獲取當前年份 getMonthValue()
獲取當前月份(1-12 ) getMonth()
獲取當前月份的名稱 getDayOfMonth()
獲取當前日期 (1-31) getDayOfYear()
獲取當前日期是今年的第幾天 (1 - 365/366) getDayOfWeek().getValue()
獲取當前星期幾(1=星期一, 7=星期天) 時分秒相關 getHour()
獲取當前小時(0-23) getMinute()
獲取當前分鐘(0-59) getSecond()
獲取當前秒數(0-59)
一、時間的表示:代碼示例
說明:LocalDate
和LocalTime
方法類似(需要導入相關的包 ),這以LocalDateTime
為例
import java. time. LocalDateTime ; public class main { public static void main ( String [ ] args) { LocalDateTime now = LocalDateTime . now ( ) ; System . out. println ( "當前年份: " + now. getYear ( ) ) ; System . out. println ( "當前月份(1-12): " + now. getMonthValue ( ) ) ; System . out. println ( "當前月份名稱: " + now. getMonth ( ) ) ; System . out. println ( "當前日期(1-31): " + now. getDayOfMonth ( ) ) ; System . out. println ( "當前日期是今年的第幾天: " + now. getDayOfYear ( ) ) ; System . out. println ( "當前星期幾(1=星期一, 7=星期天): " + now. getDayOfWeek ( ) . getValue ( ) ) ; System . out. println ( "當前小時(0-23): " + now. getHour ( ) ) ; System . out. println ( "當前分鐘(0-59): " + now. getMinute ( ) ) ; System . out. println ( "當前秒數(0-59): " + now. getSecond ( ) ) ; }
}
當前年份: 2025
當前月份(1 - 12 ): 6
當前月份名稱: JUNE
當前日期(1 - 31 ): 8
當前日期是今年的第幾天: 159
當前星期幾(1 = 星期一, 7 = 星期天): 7
當前小時(0 - 23 ): 19
當前分鐘(0 - 59 ): 55
當前秒數(0 - 59 ): 59
二、日期的格式化:代碼示例
1. 調用ofPattern()
方法傳入格式化信息的字符串 ,創建DateTimeFormatter
類對象
補充:類比記憶Date
中的格式化 調用SimpleDateFormat
的構造器傳入格式化信息的字符串
(1)format
代碼示例
import java. time. LocalDateTime ;
import java. time. format. DateTimeFormatter ; public class main { public static void main ( String [ ] args) { LocalDateTime now = LocalDateTime . now ( ) ; DateTimeFormatter dtf = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss E" ) ; String format_date = dtf. format ( now) ; System . out. println ( format_date) ; }
}
2025 - 06 - 08 20 : 14 : 56 星期日
(2)parse
代碼示例
傳參:parse(n1,n2)
注意 :被格式化字符串要和格式化信息匹配,否則會拋出異常(DateTimeParseException
)
import java. time. LocalDateTime ;
import java. time. format. DateTimeFormatter ; public class main { public static void main ( String [ ] args) { String str_datetime = "2025-06-08 14:30:00" ; DateTimeFormatter dtf = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ; LocalDateTime localDateTime = LocalDateTime . parse ( str_datetime, dtf) ; System . out. println ( localDateTime) ; }
}
2025 - 06 - 08 T14 : 30
三、日期的計算:代碼示例
(1)對于LocalDateTime
、LocalDate
、LocalTime
的計算方法
import java. time. LocalDateTime ;
import java. time. format. DateTimeFormatter ; public class main { public static void main ( String [ ] args) { LocalDateTime now = LocalDateTime . now ( ) ; DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ; String formattedDate = now. format ( formatter) ; System . out. println ( "當前日期和時間(格式化): " + formattedDate) ; LocalDateTime newDate = now. plusDays ( 10 ) ; System . out. println ( "加10天后的日期(格式化): " + newDate. format ( formatter) ) ; newDate = now. minusDays ( 5 ) ; System . out. println ( "減去5天后的日期(格式化): " + newDate. format ( formatter) ) ; newDate = now. plusMonths ( 3 ) ; System . out. println ( "加3個月后的日期(格式化): " + newDate. format ( formatter) ) ; newDate = now. minusMonths ( 2 ) ; System . out. println ( "減去2個月后的日期(格式化): " + newDate. format ( formatter) ) ; newDate = now. plusYears ( 1 ) ; System . out. println ( "加1年后的日期(格式化): " + newDate. format ( formatter) ) ; newDate = now. minusYears ( 4 ) ; System . out. println ( "減去4年后的日期(格式化): " + newDate. format ( formatter) ) ; }
}
當前日期和時間(格式化): 2025 - 06 - 08 20 : 48 : 42
加10 天后的日期(格式化): 2025 - 06 - 18 20 : 48 : 42
減去5 天后的日期(格式化): 2025 - 06 - 03 20 : 48 : 42
加3 個月后的日期(格式化): 2025 - 09 - 08 20 : 48 : 42
減去2 個月后的日期(格式化): 2025 - 04 - 08 20 : 48 : 42
加1 年后的日期(格式化): 2026 - 06 - 08 20 : 48 : 42
減去4 年后的日期(格式化): 2021 - 06 - 08 20 : 48 : 42
(2)Period 代碼示例
import java. time. LocalDate ;
import java. time. Period ; public class PeriodExample { public static void main ( String [ ] args) { LocalDate startDate = LocalDate . of ( 2020 , 1 , 1 ) ; LocalDate endDate = LocalDate . of ( 2025 , 6 , 8 ) ; Period period = Period . between ( startDate, endDate) ; System . out. println ( "期間:" ) ; System . out. println ( "年: " + period. getYears ( ) ) ; System . out. println ( "月: " + period. getMonths ( ) ) ; System . out. println ( "日: " + period. getDays ( ) ) ; }
}
期間:
年: 5
月: 5
日: 7
(3)Duration 代碼示例
import java. time. Duration ;
import java. time. LocalDateTime ; public class DurationExample { public static void main ( String [ ] args) { LocalDateTime startTime = LocalDateTime . of ( 2025 , 6 , 8 , 10 , 30 , 0 ) ; LocalDateTime endTime = LocalDateTime . of ( 2025 , 6 , 9 , 12 , 45 , 0 ) ; Duration duration = Duration . between ( startTime, endTime) ; System . out. println ( "持續時間:" ) ; System . out. println ( "小時: " + duration. toHours ( ) ) ; System . out. println ( "分鐘: " + duration. toMinutes ( ) ) ; System . out. println ( "秒: " + duration. getSeconds ( ) ) ; }
}
持續時間:
小時: 26
分鐘: 1575
秒: 94500
(4)綜合計算年月日時分秒的差值
Period
類和Duration
類的綜合使用
注意點:注意取模
import java. time. Duration ;
import java. time. LocalDateTime ;
import java. time. Period ; public class main { public static void main ( String [ ] args) { LocalDateTime start = LocalDateTime . of ( 2025 , 6 , 1 , 14 , 30 , 0 ) ; LocalDateTime end = LocalDateTime . of ( 2025 , 6 , 8 , 18 , 45 , 30 ) ; Period period = Period . between ( start. toLocalDate ( ) , end. toLocalDate ( ) ) ; Duration duration = Duration . between ( start, end) ; int years = period. getYears ( ) ; int months = period. getMonths ( ) ; int days = period. getDays ( ) ; long hours = duration. toHours ( ) % 24 ; long minutes = duration. toMinutes ( ) % 60 ; long seconds = duration. getSeconds ( ) % 60 ; System . out. println ( "日期差: " + years + "年 " + months + "月 " + days + "天" ) ; System . out. println ( "時分秒差: " + hours + "小時 " + minutes + "分鐘 " + seconds + "秒" ) ; }
日期差: 0 年 0 月 7 天
時分秒差: 4 小時 15 分鐘 30 秒
四、時間戳:代碼示例
import java. time. Instant ;
import java. util. Date ; public class main { public static void main ( String [ ] args) { Instant instant_now = Instant . now ( ) ; System . out. println ( "instant_now:" + instant_now) ; Date date = Date . from ( instant_now) ; System . out. println ( "date:" + date) ; Instant date_to_instant = date. toInstant ( ) ; System . out. println ( date_to_instant) ; }
}