JDK8以后新增的时间相关类
Date类 | ZoneId:时区 |
Instant:时间戳 | |
ZoneDateTime:带时区的时间 | |
日期格式化类 SimpleDateFormat |
DateTimeFormatter:用于时间的格式化和解析 |
日历类 Calendar |
LocalDate:年、月、日 |
LocalTime:时、分、秒 | |
LocalDateTime:年、月、日、时、分、秒 | |
工具类 | Period:时间间隔(年,月,日) |
Duration:时间间隔(秒,纳秒) | |
ChronoUnit:时间间隔(所有单位) |
优势
代码层面:代码更加简单
安全层面:规定时间日期对象不可变,修改后的值记录在一个新的变量中,解决了多线程环境下数据安全问题
Zoneld时区
常见方法:
方法名 | 说明 |
static Set<String> getAvailableZoneIds () | 获取Java中支持的所有时区 |
static ZoneId systemDefault () | 获取系统默认时区 |
static ZoneId of (String zoneId) | 获取一个指定时区 |
代码演示:
import java.time.ZoneId;
import java.util.Set;
public class Test6 {
public static void main(String[] args) {
//获取Java中支持的所有时区
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
//Java中支持600个时区
System.out.println(availableZoneIds.size());//600
//获取系统默认时区
ZoneId zi1 = ZoneId.systemDefault();
System.out.println(zi1);//Asia/Shanghai
//获取一个指定时区
ZoneId zi2 = ZoneId.of("Asia/Taipei");
System.out.println(zi2);//Asia/Taipei
}
}
Instant时间戳
常见方法:
方法名 | 说明 |
static Instant now () | 获取当前时间的Instant对象 (标准时间) |
static Instant ofXxxx (long epochMilli) | 根据(秒/毫秒/纳秒)获取Instant对象 |
ZonedDateTime atZone (ZoneId zone) | 指定时区 |
boolean isXxx (InstantotherInstant) | 判断时间系列的方法 |
Instant minusXxx (long millisToSubtract) | 减少时间系列的方法 |
Instant plusXxx (long millisToSubtract) | 增加时间系列的方法 |
代码演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test7 {
public static void main(String[] args) {
//获取当前时间的Instant对象
Instant it1 = Instant.now();
System.out.println(it1);//2025-04-25T08:57:35.873433800Z
//根据(秒/毫秒/纳秒)获取Instant对象
//秒
Instant it2 = Instant.ofEpochSecond(1L);
System.out.println(it2);//1970-01-01T00:00:01Z
//毫秒
Instant it3 = Instant.ofEpochMilli(1000L);
System.out.println(it3);//1970-01-01T00:00:01Z
//纳秒
Instant it4 = Instant.ofEpochSecond(1, 1000000000);
System.out.println(it4);//1970-01-01T00:00:02Z
//指定时区,中国在时间原点上加8小时
Instant it5 = Instant.ofEpochMilli(0L);
ZoneId zi = ZoneId.of("Asia/Shanghai");
ZonedDateTime zdt = it5.atZone(zi);
System.out.println(zdt);//1970-01-01T08:00+08:00[Asia/Shanghai]
//判断时间系列的方法
Instant it6 = Instant.ofEpochMilli(1000L);
Instant it7 = Instant.ofEpochMilli(2000L);
boolean flag1 = it6.isBefore(it7);
System.out.println(flag1);//true
boolean flag2 = it6.isAfter(it7);
System.out.println(flag2);//false
//减少时间系列的方法
Instant it8 = Instant.ofEpochMilli(3000L);
System.out.println(it8);//1970-01-01T00:00:03Z
//减1000毫秒
Instant it9 = it8.minusMillis(1000L);
System.out.println(it9);//1970-01-01T00:00:02Z
//减1秒
Instant it10 = it8.minusSeconds(1L);
System.out.println(it10);//1970-01-01T00:00:02Z
//减1000000000纳秒
Instant it11 = it8.minusNanos(1000000000L);
System.out.println(it11);//1970-01-01T00:00:02Z
//增加时间系列的方法
Instant it12 = Instant.ofEpochMilli(0L);
System.out.println(it12);//1970-01-01T00:00:00Z
//加1000毫秒
Instant it13 = it12.plusMillis(1000L);
System.out.println(it13);//1970-01-01T00:00:01Z
//加1秒
Instant it14 = it12.plusSeconds(1L);
System.out.println(it14);//1970-01-01T00:00:01Z
//加1000000000纳秒
Instant it15 = it12.plusNanos(1000000000L);
System.out.println(it15);//1970-01-01T00:00:01Z
}
}
ZoneDateTime带时区的时间
常见方法:
方法名 | 说明 |
static ZonedDateTime now () | 获取当前时间的ZonedDateTime对象 |
static ZonedDateTime ofXxxx (......) | 获取指定时间的ZonedDateTime对象 |
ZonedDateTime withXxx (时间) | 修改时间系列的方法 |
ZonedDateTime minusXxx (时间) | 减少时间系列的方法 |
ZonedDateTime plusXxx (时间) | 增加时间系列的方法 |
代码演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test8 {
public static void main(String[] args) {
//获取当前时间(带时区)
ZonedDateTime zdt1 = ZonedDateTime.now();
System.out.println(zdt1);//2025-04-25T17:26:50.183160400+08:00[Asia/Shanghai]
//获取指定时间
//年、月、日、时、分、秒、纳秒方式指定
ZonedDateTime zdt2 = ZonedDateTime.of(2020, 10, 10,
10, 10, 10, 0,
ZoneId.of("Asia/Shanghai"));
System.out.println(zdt2);//2020-10-10T10:10:10+08:00[Asia/Shanghai]
//Instant+时区指定
Instant it = Instant.ofEpochMilli(0L);
ZoneId zi = ZoneId.of("Asia/Shanghai");
ZonedDateTime zdt3 = ZonedDateTime.ofInstant(it, zi);
System.out.println(zdt3);//1970-01-01T08:00+08:00[Asia/Shanghai]
//修改时间系列的方法
//例如:修改年份为2021
ZonedDateTime zdt4 = zdt3.withYear(2021);
System.out.println(zdt4);//2021-01-01T08:00+08:00[Asia/Shanghai]
//同理,其他字段也可以修改
//减少时间系列的方法
//例如:减少1小时
ZonedDateTime zdt5 = zdt3.minusHours(1);
System.out.println(zdt5);//1970-01-01T07:00+08:00[Asia/Shanghai]
//增加时间系列的方法
//例如:增加1年
ZonedDateTime zdt6 = zdt3.plusYears(1);
System.out.println(zdt6);//1971-01-01T08:00+08:00[Asia/Shanghai]
}
}
DateTimeFormatter时间的格式化和解析
常见方法:
方法名 | 说明 |
static DateTimeFormatter ofpattern (格式) | 获取格式对象 |
string format (时间对象) | 按照指定方式格式化 |
代码演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Test9 {
public static void main(String[] args) {
//static DateTimeFormatter ofpattern (格式) 获取格式对象
//string format (时间对象) 按照指定方式格式化
//创建带时区的时间对象
ZonedDateTime zdt = ZonedDateTime.ofInstant(
Instant.ofEpochMilli(0L),
ZoneId.of("Asia/Shanghai"));
//获取格式对象
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//按照指定方式格式化
String str = dtf.format(zdt);
System.out.println(str);//1970-01-01 08:00:00
}
}
LocalDate、LocalTime、LocalDateTime
常见方法:
方法 | 说明 |
static xxx now () | 获取当前时间的对象 |
static xxx of (......) | 获取指定时间的对象 |
get开头的方法 | 获取日历中的年、月、日、 时、分、秒等信息 |
isBefore, isAfter | 比较两个时间 |
with开头的方法 | 修改时间系列方法 |
minus开头的方法 | 减少时间系列方法 |
plus开头的方法 | 增加时间系列方法 |
public LocalDate toLocalDate () | LocalDateTime转换成一个LocalDate对象 |
public LocalTime toLocalTime () | LocalDateTime转换成一个LocalTime对象 |
代码演示:
LocalDate:(年,月,日)
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
public class Test10 {
public static void main(String[] args) {
//1.获取当前时间的日历对象(包含 年月日)
LocalDate nowDate = LocalDate.now();
System.out.println("今天的日期:" + nowDate);//今天的日期:2025-04-25
//2.获取指定的时间的日历对象
LocalDate ldDate = LocalDate.of(2023, 1, 1);
System.out.println("指定日期:" + ldDate);//指定日期:2023-01-01
//3.get系列方法获取日历中的每一个属性值
//获取年
int year = ldDate.getYear();
System.out.println("year: " + year);//year: 2023
//获取月
//方式一:
Month m = ldDate.getMonth();
System.out.println(m);//JANUARY
System.out.println(m.getValue());//1
//方式二:
int month = ldDate.getMonthValue();
System.out.println("month: " + month);//month: 1
//获取日
int day = ldDate.getDayOfMonth();
System.out.println("day:" + day);//day:1
//获取一年的第几天
int dayofYear = ldDate.getDayOfYear();
System.out.println("dayOfYear:" + dayofYear);//dayOfYear:1
//获取星期
DayOfWeek dayOfWeek = ldDate.getDayOfWeek();
System.out.println(dayOfWeek);//SUNDAY
System.out.println(dayOfWeek.getValue());//7
//is开头的方法表示判断
System.out.println(ldDate.isBefore(ldDate));//false
System.out.println(ldDate.isAfter(ldDate));//false
//with开头的方法表示修改,只能修改年月日
LocalDate withLocalDate = ldDate.withYear(2000);
System.out.println(withLocalDate);//2000-01-01
//minus开头的方法表示减少,只能减少年月日
LocalDate minusLocalDate = ldDate.minusYears(1);
System.out.println(minusLocalDate);//2022-01-01
//plus开头的方法表示增加,只能增加年月日
LocalDate plusLocalDate = ldDate.plusDays(1);
System.out.println(plusLocalDate);//2023-01-02
}
}
LocalTime:(时、分、秒)
import java.time.LocalTime;
public class Test11 {
public static void main(String[] args) {
// 获取本地时间的日历对象。(包含 时分秒)
LocalTime nowTime = LocalTime.now();
System.out.println("今天的时间:" + nowTime);//今天的时间:18:34:24.363704100
int hour = nowTime.getHour();//时
System.out.println("hour: " + hour);//hour: 18
int minute = nowTime.getMinute();//分
System.out.println("minute: " + minute);//minute: 34
int second = nowTime.getSecond();//秒
System.out.println("second:" + second);//second:24
int nano = nowTime.getNano();//纳秒
System.out.println("nano:" + nano);//nano:363704100
//指定时分
System.out.println(LocalTime.of(8, 20));//08:20
//指定时分秒
System.out.println(LocalTime.of(8, 20, 30));//08:20:30
//时分秒纳秒
LocalTime mTime = LocalTime.of(8, 20, 30, 150);
System.out.println(mTime);//08:20:30.000000150
//is系列的方法
System.out.println(nowTime.isBefore(mTime));//false
System.out.println(nowTime.isAfter(mTime));//true
//with系列的方法,只能修改时、分、秒
System.out.println(mTime.withHour(10));//10:20:30.000000150
//plus系列的方法,只能修改时、分、秒
System.out.println(mTime.plusHours(10));//18:20:30.000000150
}
}
LocalDateTime:(年、月、日、时、分、秒)
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test12 {
public static void main(String[] args) {
// 当前时间的的日历对象(包含年月日时分秒)
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("今天是:" + nowDateTime);//今天是:2025-04-25T18:40:32.776723800
//年
System.out.println(nowDateTime.getYear());//2025
//月
System.out.println(nowDateTime.getMonthValue());//4
//日
System.out.println(nowDateTime.getDayOfMonth());//25
//时
System.out.println(nowDateTime.getHour());//18
//分
System.out.println(nowDateTime.getMinute());//40
//秒
System.out.println(nowDateTime.getSecond());//32
//纳秒
System.out.println(nowDateTime.getNano());//776723800
//日:当年的第几天
System.out.println("dayofYear:" + nowDateTime.getDayOfYear());//dayofYear:115
//星期
System.out.println(nowDateTime.getDayOfWeek());//FRIDAY
System.out.println(nowDateTime.getDayOfWeek().getValue());//5
//月份
System.out.println(nowDateTime.getMonth());//APRIL
System.out.println(nowDateTime.getMonth().getValue());//4
//转化
LocalDate ld = nowDateTime.toLocalDate();
System.out.println(ld);//2025-04-25
LocalTime lt = nowDateTime.toLocalTime();
System.out.println(lt.getHour());//18
System.out.println(lt.getMinute());//40
System.out.println(lt.getSecond());//32
}
}
工具类
作用:
Period:用于计算两个“日期”间隔(年、月、日)
Duration:用于计算两个“时间”间隔(秒,纳秒)
ChronoUnit:用于计算两个“日期”间隔
代码演示:
Period:
import java.time.LocalDate;
import java.time.Period;
public class Test13 {
public static void main(String[] args) {
//当前本地 年月日
LocalDate today = LocalDate.now();
System.out.println(today);//2025-04-25
//生日的 年月日
LocalDate birthDate = LocalDate.of(2000, 1, 1);
System.out.println(birthDate);//2000-01-01
Period period = Period.between(birthDate, today);//第二个参数减第一个参数
System.out.println("相差的时间间隔对象:" + period);//相差的时间间隔对象:P25Y3M24D
System.out.println(period.getYears());//25
System.out.println(period.getMonths());//3
System.out.println(period.getDays());//24
//间隔总月份
System.out.println(period.toTotalMonths());//303
}
}
Duration:
import java.time.Duration;
import java.time.LocalDateTime;
public class Test14 {
public static void main(String[] args) {
//本地日期时间对象。
LocalDateTime today = LocalDateTime.now();
System.out.println(today);//2025-04-25T18:56:24.858802500
//出生的日期时间对象
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
System.out.println(birthDate);//2000-01-01T00:00
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println("相差的时间间隔对象:" + duration);//相差的时间间隔对象:PT221922H56M24.8588025S
//两个时间差的天数
System.out.println(duration.toDays());//9246
//两个时间差的小时数
System.out.println(duration.toHours());//221922
//两个时间差的分钟数
System.out.println(duration.toMinutes());//13315376
//两个时间差的毫秒数
System.out.println(duration.toMillis());//798922584858
//两个时间差的纳秒数
System.out.println(duration.toNanos());//798922584858802500
}
}
ChronoUnit:(最常用)
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Test15 {
public static void main(String[] args) {
//当前时间
LocalDateTime today = LocalDateTime.now();
System.out.println(today);//2025-04-25T19:03:48.048897900
//生日时间
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1,
0, 0, 0);
System.out.println(birthDate);//2000-01-01T00:00
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
}
}