Java8日期类LocalDate、LocalTime和LocalDateTime使用方法详解

 更新时间:2023年11月25日 15:34:34   作者:流水武qin  
这篇文章主要给大家介绍了关于Java8日期类LocalDate、LocalTime和LocalDateTime使用方法的相关资料,LocalDateTime是JDK1.8出现的新特性,解决线程不安全的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、Java8之前日期类所存在的问题

Java8之前通常会使用Date结合 SimpleDateFormatCalender来处理时间和日期的相关需求。

但是这些API也存在明显的缺点:

  • 可读性差、易用性差、使用起来冗余繁琐

  • java.util.Date 是非线程安全的

  • java.util.Date 存在千年虫问题、并且不支持国际化和时区、故大部分方法被声明为过时、不建议再使用

  • java.utiljava.sql两包中都有Date类,设计上并不合理

java8java.time包下重新实现了日期相关类。

每个类功能明确清晰、类之间协作简单、API 定义清晰、功能强大无需借助外部工具类,并且线程安全。

二、Java8新增日期类

Java8新增的日期类主要有三个:

  • LocalDate:表示日期(年月日)

  • LocalTime :表示时间(时分秒)

  • LocalDateTime:表示时间+ 日期 (年月日时分秒),是java8最常用的日期类

这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类。

因此它们都是线程安全的。

2.1 LocalDate

2.1.1 常用API

方法描述
static LocalDate now()获取默认时区的当前日期对象
static LocalDate now(Clock clock)从指定时钟获取当前日期对象
static LocalDate now(ZoneId zone)获取指定时区的当前日期对象
of根据指定年月日创建LocalDate对象
getYear获得年份
getMonthValue获得月份(1-12)
getMonth获得月份枚举值
getDayOfMonth获得月份中的第几天(1-31)
getDayOfWeek获得星期几
getDayOfYear获得年份中的第几天(1-366)
lengthOfYear获得当年总天数
lengthOfMonth获得当月总天数
toEpochDay与时间纪元(1970年1月1日)相差的天数
plusDays加天
plusWeeks加周
plusMonths加月
plusYears加年
minusDays减年
minusWeeks减周
minusMonths减月
minusYears减年
withYear替换年份
withMonth替换月份
withDayOfMonth替换月份中的第几天(1-31)
withDayOfYear替换年份中的第几天(1-366)
isBefore是否日期在之前
isAfter是否日期在之后
isEqual是否是当前日期
isleapYear是否是闰年

2.1.2 使用示例

1)创建方法

LocalDate now1 = LocalDate.now();							// 当前日期 
LocalDate now2 = LocalDate.now(ZoneId.of("Asia/Shanghai"));	// 当前日期 (指定时区)
LocalDate now3 = LocalDate.now(Clock.systemDefaultZone());	// 当前日期 (指定时钟)
LocalDate localDate = LocalDate.of(2023, 1, 1);				// 指定日期 2023-01-01

2)获取方法

LocalDate now = LocalDate.now();
int year = now.getYear();						// 获取年份
int month = now.getMonthValue();				// 获取月份(1-12)
Month monthEnum = now.getMonth();				// 获取月份的枚举值
int dayOfMonth = now.getDayOfMonth();			// 获取月份中的第几天(1-31)
int dayOfYear = now.getDayOfYear();				// 获取一年中的第几天(1-366)
DayOfWeek dayOfWeek = now.getDayOfWeek();		// 获取现在是星期几
int dayOfYear = now.getDayOfYear();				// 获取一年中的第几天(1-366)
int lengthOfYear = now.lengthOfYear();			// 获得当年总天数
int lengthOfMonth = now.lengthOfMonth();		// 获得当月总天数
long epochDay = now.toEpochDay();				// 与时间纪元(1970年1月1日)相差的天数

3)运算方法

LocalDate now = LocalDate.now();
LocalDate localDate1 = now.plusDays(1);			// 给当前时间加一天
LocalDate localDate2 = now.plusDays(1);			// 给当前时间加一周
LocalDate localDate3 = now.plusMonths(1);		// 给当前时间加一月
LocalDate localDate4 = now.plusYears(1);		// 给当前时间加一年
LocalDate localDate5 = now.minusDays(1);		// 给当前时间减一天
LocalDate localDate6 = now.minusWeeks(1);		// 给当前时间减一周
LocalDate localDate7 = now.minusMonths(1);		// 给当前时间减一月
LocalDate localDate8 = now.minusYears(1);		// 给当前时间减一年

4)修改方法

LocalDate now = LocalDate.now();
LocalDate localDate1 = now.withYear(2020);		// 修改日期对象年份为2020
LocalDate localDate2 = now.withMonth(1);		// 修改日期对象月份为1
LocalDate localDate3 = now.withDayOfMonth(1);	// 修改日期对象的日期(一月中的第几天)
LocalDate localDate4 = now.withDayOfYear(1);	// 修改日期对象的日期(一年中的第几天)

5)比较方法

LocalDate now = LocalDate.now();
LocalDate localDate = LocalDate.of(2023, 1, 1)
    
boolean isBefore = localDate.isBefore(now);		// localDate是否在当天之前
boolean isAfter = localDate.isAfter(now);		// localDate是否在当天之后
boolean isEqual = localDate.isEqual(now);		// localDate是否在当天
boolean isLeapYear = localDate.isLeapYear();	// localDate是否是闰年

6)LocalDate 与 Date之间的转换

/**
 * LocalDate转Date
 * @param localDate
 * @return
 */
public static Date toDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}

/**
 * Date转LocalDate
 * @param Date
 * @return
 */
public static Date toLocalDate(Date date) {
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}

7)LocalDate 与 String之间的转换

/**
  * String转LocalDate
  * @param dateStr 	   日期的字符串
  * @param pattern 	   格式示例: yyyy-MM-dd
  * @return
  */
public static LocalDate toLocalDate(String dateStr, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return LocalDate.parse(dateStr, formatter);
}

/**
  * LocalDate转String
  * @param localDate   localDate对象
  * @param pattern 	   格式示例: yyyy-MM-dd
  * @return
  */
public static String LocalDatetoStr(LocalDate localDate, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return localDate.format(formatter);
}

2.2 LocalTime

2.2.1 常用API

方法描述
static LocalTime now()获取默认时区的当前时间
static LocalTime now(ZoneId zone)获取指定时区的当前时间
static LocalTime now(Clock clock)从指定时钟获取当前时间
of根据指定的时、分、秒获取LocalTime 实例
getHour获取小时
getMinute获取分钟
getSecond获取秒
getNano获取纳秒
plusHours增加小时数
plusMinutes增加分钟数
plusSeconds增加秒数
plusNanos增加纳秒数
minusHours减少小时数
minusMinutes减少分钟数
minusSeconds减少秒数
minusNanos减少纳秒数
withHour替换小时
withMinute替换分钟
withSecond替换秒钟
withNano替换纳秒
compareTo时间与另一个时间比较
isAfter检查时间是否在指定时间之后
isBefore检查时间是否在指定时间之前

2.2.2 使用示例

1)创建方法

LocalTime now1 = LocalTime.now();							// 当前时间 
LocalTime now2 = LocalTime.now(ZoneId.of("Asia/Shanghai"));	// 当前时间 (指定时区)
LocalTime now3 = LocalTime.now(Clock.systemDefaultZone());	// 当前时间 (指定时钟)
LocalTime localTime = LocalTime.of(9, 9, 9);				// 指定时间 09:09:09

2)获取方法

LocalTime now = LocalTime.now();
int hour = now.getHour();						// 获取小时
int minute = now.getMinute();					// 获取小时
int second = now.getSecond();					// 获取秒
int nano = now.getNano();						// 获取纳秒

3)运算方法

LocalTime now = LocalTime.now();
LocalTime localTime1 = now.plusHours(1);		// 给当前时间加一小时	
LocalTime localTime2 = now.plusMinutes(1);		// 给当前时间加一分钟	
LocalTime localTime3 = now.plusSeconds(1);		// 给当前时间加一秒
LocalTime localTime4 = now.plusNanos(1);		// 给当前时间加一纳秒
LocalTime localTime1 = now.minusHours(1);		// 给当前时间减一小时
LocalTime localTime2 = now.minusMinutes(1);		// 给当前时间减一分钟	
LocalTime localTime3 = now.minusSeconds(1);		// 给当前时间减一秒
LocalTime localTime4 = now.minusNanos(1);		// 给当前时间减一纳秒

4)修改方法

LocalTime now = LocalTime.now();
LocalDate localTime1 = now.withHour(1);			// 修改时间对象小时为1
LocalDate localTime2 = now.withMinute(1);		// 修改时间对象分钟为1
LocalDate localTime3 = now.withSecond(1);		// 修改时间对象秒钟为1
LocalDate localTime4 = now.withNano(1);			// 修改时间对象纳秒为1

5)比较方法

LocalTime now = LocalTime.now();
LocalTime localTime = LocalTime.of(9, 9, 9);
int compare = localTime.compareTo(now);		// localTime和当前时间比较--0(相等)正数(大)负数(小)
boolean after = localTime.isAfter(now);		// localTime是否在当前时间之后
boolean before = localTime.isBefore(now);	// localTime是否在当前时间之前

6)LocalTime 与 String之间的转换

/**
  * String转LocalTime
  * @param timeStr 	   日期的字符串
  * @param pattern 	   格式示例: HH:mm:ss
  * @return
  */
public static LocalTime toLocalTime(String timeStr, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return LocalTime.parse(timeStr, formatter);
}

/**
  * LocalTime转String
  * @param localTime   localTime对象
  * @param pattern 	   格式示例: HH:mm:ss
  * @return
  */
public static LocalTime localTimeToStr(LocalTime localTime, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return localTime.format(formatter);
}

LocalTime是无法转换为Date的,因为它值包含了时间部分,而没有日期部分

2.3 LocalDateTime

2.2.1 常用API

方法描述
static LocalDateTime now()获取默认时区的当前日期时间
static LocalDateTime now(Clock clock)从指定时钟获取当前日期时间
static LocalDateTime now(ZoneId zone)获取指定时区的当前日期时间
static LocalDateTime of(LocalDate date, LocalTime time)根据日期和时间对象获取LocalDateTime 对象
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)根据指定的年、月、日、时、分、秒获取LocalDateTime 实例
getYear获取年份
getMonth使用月份枚举类获取月份
getDayOfMonth获取日期在该月是第几天
getDayOfWeek获取日期是星期几
getDayOfYear获取日期在该年是第几天
getHour获取小时
getMinute获取分钟
getSecond获取秒
getNano获取纳秒
plusYears增加年
plusMonths增加月
plusWeeks增加周
plusDays增加天
plusHours增加小时
plusMinutes增加分
plusSeconds增加秒
plusNanos增加纳秒
minusYears减少年
minusMonths减少月
meminusWeeks减少周
minusDays减少天
minusHours减少小时
minusMinutes减少分
minusSeconds减少秒
minusNanos减少纳秒
withYear替换年份
withMonth替换月份
withDayOfMonth替换月份中的第几天(1-31)
withDayOfYear替换年份中的第几天(1-366)
withHour替换小时
withMinute替换分钟
withSecond替换秒钟
withNano替换纳秒
isEqual判断日期时间是否相等
isBefore检查是否在指定日期时间之前
isAfter检查是否在指定日期时间之后

2.2.2 使用示例

1)创建方法

// 1.当前日期
LocalDateTime now1 = LocalDateTime.now();
// 2.当前日期 (指定时区)
LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
// 3.当前日期 (指定时钟)
LocalDateTime now3 = LocalDateTime.now(Clock.systemDefaultZone());
// 4.指定日期 2023-01-01 01:01:00
LocalDateTime localDateTime1 = LocalDateTime.of(2023, 1, 1, 1, 1);
// 4.使用LocalDate和LocalTime对象创建LocalDateTime对象
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);

2)获取方法

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();                   	// 获取年份
Month month = now.getMonth();               	// 使用月份枚举值
int dayOfMonth = now.getDayOfMonth();       	// 获取日期在该月是第几天
DayOfWeek dayOfWeek = now.getDayOfWeek();  		// 获取日期是星期几
int dayOfYear = now.getDayOfYear();         	// 获取日期在该年是第几天
int hour = now.getHour();                   	// 获取小时
int minute = now.getMinute();               	// 获取分钟
int second = now.getSecond();               	// 获取秒钟
int nano = now.getNano();                   	// 获取纳秒

3)运算方法

LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime1 = now.plusDays(1);			// 给当前时间加一天
LocalDateTime localDateTime2 = now.plusDays(1);			// 给当前时间加一周
LocalDateTime localDateTime3 = now.plusMonths(1);		// 给当前时间加一月
LocalDateTime localDateTime4 = now.plusYears(1);		// 给当前时间加一年
LocalDateTime localDateTime5 = now.plusHours(1);		// 给当前时间加一小时
LocalDateTime localDateTime6 = now.plusMinutes(1);		// 给当前时间加一分钟
LocalDateTime localDateTime7 = now.plusSeconds(1);		// 给当前时间加一秒
LocalDateTime localDateTime8 = now.plusNanos(1);		// 给当前时间加一纳秒
LocalDateTime localDateTime9 = now.minusDays(1);		// 给当前时间减一天
LocalDateTime localDateTime10 = now.minusWeeks(1);		// 给当前时间减一周
LocalDateTime localDateTime11 = now.minusMonths(1);		// 给当前时间减一月
LocalDateTime localDateTime12 = now.minusYears(1);		// 给当前时间减一年
LocalDateTime localDateTime13 = now.minusHours(1);		// 给当前时间减一小时
LocalDateTime localDateTime14 = now.minusMinutes(1);	// 给当前时间减一分钟
LocalDateTime localDateTime15 = now.minusSeconds(1);	// 给当前时间减一秒
LocalDateTime localDateTime16 = now.minusNanos(1);		// 给当前时间减一纳秒

4)修改方法

LocalDateTime now = LocalDateTime.now();
LocalDateTime localDate1 = now.withYear(2020);		    // 修改日期对象年份为2020
LocalDateTime localDate2 = now.withMonth(1);		    // 修改日期对象月份为1
LocalDateTime localDate3 = now.withDayOfMonth(1);	    // 修改日期对象的日期(一月中的第几天)
LocalDateTime localDate4 = now.withDayOfYear(1);	    // 修改日期对象的日期(一年中的第几天)
LocalDateTime localTime1 = now.withHour(1);			    // 修改时间对象小时为1
LocalDateTime localTime2 = now.withMinute(1);		    // 修改时间对象分钟为1
LocalDateTime localTime3 = now.withSecond(1);		    // 修改时间对象秒钟为1
LocalDateTime localTime4 = now.withNano(1);				// 修改时间对象纳秒为1

5)比较方法

LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 1, 1);
boolean isBefore = localDateTime.isBefore(now);			// localDateTime是否在当天之前
boolean isAfter = localDateTime.isAfter(now);		    // localDateTime是否在当天之后
boolean isEqual = localDateTime.isEqual(now);		    // localDateTime是否在当天

6)从LocalDateTime获取LocalDate或者LocalTime

LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();    // 从LocalDateTime获取LocalDate对象
LocalTime localTime = localDateTime.toLocalTime();    // 从LocalDateTime获取LocalTime对象

7)LocalDateTime与 String之间的转换

/**
  * String转LocalDateTime
  * @param dateTimeStr 日期的字符串
  * @param pattern 	   格式示例: yyyy-MM-dd HH:mm:ss
  * @return
  */
public static LocalDateTime toLocalDateTime(String dateTimeStr, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return LocalDateTime.parse(dateTimeStr, formatter);
}

/**
  * LocalDateTime转String
  * @param localDateTime 日期时间对象
  * @param pattern 	   	 格式示例: yyyy-MM-dd HH:mm:ss
  * @return
  */
public static String LocalDateTimetoStr(LocalDateTime localDateTime, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    return localDateTime.format(formatter);
}

8)LocalDateTime与 Date之间的转换

/**
  * Date转LocalDateTime
  * @param date          jdk6 日期对象
  * @param zoneId        时区id
  * @return
  */
public static LocalDateTime toLocalDateTime(Date date, ZoneId zoneId) {
    // toInstant():将Date对象转换成为Instant(瞬时)对象
    // ofInstant(): 将瞬时对象转换成为LocalDateTime对象
    Instant instant = date.toInstant();
    if (zoneId == null) {
        zoneId = ZoneId.systemDefault();
    }
    return LocalDateTime.ofInstant(instant, zoneId);
}

/**
  * LocalDateTime转Date
  * @param localDateTime  日期时间对象
  * @return
  */
public static Date LocalDateTimetoDate(LocalDateTime localDateTime, ZoneId zoneId) {
    if (zoneId == null) {
        zoneId = ZoneId.systemDefault();
    }
    ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
    Instant instant = zonedDateTime.toInstant();
    return Date.from(instant);
}

总结 

到此这篇关于Java8日期类LocalDate、LocalTime和LocalDateTime使用方法详解的文章就介绍到这了,更多相关Java8日期类详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot Shiro anno不启作用问题及解决

    Springboot Shiro anno不启作用问题及解决

    在Shiro配置中遇到静态资源被拦截的问题,通过排除LinkedHashMap过滤次序和将过滤器手动创建而不是注册到容器中解决,同时,确保JwtUtil类也不注册到容器中,以避免请求报Not authorized错误
    2026-03-03
  • SpringCloud实现全链路灰度发布的示例详解

    SpringCloud实现全链路灰度发布的示例详解

    灰度发布是指在软件或服务发布过程中,将新版本的功能或服务以较小的比例引入到生产环境中,仅向部分用户或节点提供新功能的一种发布策略,下面我们就来学习一下SpringCloud如何实现全链路灰度发布
    2023-11-11
  • Java中ArrayList集合的常用方法大全

    Java中ArrayList集合的常用方法大全

    这篇文章主要给大家介绍了关于Java中ArrayList集合的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • SpringBoot 内置 CollectionUtil用法实战指南

    SpringBoot 内置 CollectionUtil用法实战指南

    文章介绍了SpringBoot中自带的CollectionUtil类,包括判空、转换、合并、匹配和兜底功能,并通过实战例子详细展示了这些功能的应用场景和优势,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • java新人基础入门之递归调用

    java新人基础入门之递归调用

    这篇文章主要给大家介绍了关于java新人基础入门之递归调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • SpringBoot中分页插件PageHelper的使用详解

    SpringBoot中分页插件PageHelper的使用详解

    分页查询是为了高效展示大量数据,通过分页将数据划分为多个部分逐页展示,原生方法需手动计算数据起始行,而使用PageHelper插件则简化这一过程,本文给大家介绍SpringBoot中分页插件PageHelper的使用,感兴趣的朋友一起看看吧
    2024-09-09
  • java两个线程同时写一个文件

    java两个线程同时写一个文件

    这篇文章主要为大家详细介绍了java两个线程同时写一个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MyBatis-Plus拦截器实现数据权限控制的方法

    MyBatis-Plus拦截器实现数据权限控制的方法

    MyBatis-Plus是一款基于MyBatis的增强工具,它提供了一些便捷的功能和增强的查询能力,数据权限控制是在系统中对用户访问数据进行限制的一种机制,这篇文章主要给大家介绍了关于MyBatis-Plus拦截器实现数据权限控制的相关资料,需要的朋友可以参考下
    2024-01-01
  • SpringBoot3解决跨域请求的方案小结

    SpringBoot3解决跨域请求的方案小结

    解决跨域请求,主要有JSONP,iframe,window.name,CORS等方式,其中CORS方式是最常用的跨域实现方式,而且是对各种请求方法、各种数据请求类型都是完美支持的,本文介绍了SpringBoot3解决跨域请求的方案小结,需要的朋友可以参考下
    2024-07-07
  • SpringBoot控制台秒变炫彩特效的实现指南

    SpringBoot控制台秒变炫彩特效的实现指南

    本文介绍如何自定义SpringBoot启动横幅,通过banner.txt文件设置ASCII图案、版本号等,并使用ANSI颜色增强效果,还提供关闭默认Banner、添加启动信息及彩色提示的实现方法,需要的朋友可以参考下
    2025-10-10

最新评论