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