日期类
第一代日期类: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) ; }
}