java8时间---java.time.LocalDate

本文介绍Java 8中新的日期时间API,重点讲解LocalDate类的使用方法,包括初始化、转换、获取和更改日期分量、日期比较及与其他类的交互。此外还介绍了如何处理日期的国际化和时区问题。

1 所有类都是不变的,线程安全的;

2 所有类都提供了格式化和转化方法,不再依靠java.text包,所有类都提供了+-*/等操作时间的方法;

3 所有类都采用工厂模式和策略模式,便于和其它类协同工作;

4 提供了国家化和时区支持,不再依靠java.util.Calendar和java.util.TimeZone类;

****************************************

java.time.LocalDate

日期:年月日

常用方法

1 初始化

LocalDate ld = LocalDate.now();  //2017-11-28,当前日期

LocalDate ld = LocalDate.of(2017, 11, 29);  //2017-11-29,参数都是int

LocalDate ld = LocalDate.of(2017, Month.NOVEMBER, 29);  //2017-11-29,参数有一个Month类型

LocalDate ld = LocalDate.ofYearDay(2017, 1);  //2017-01-01,某年的第几天

LocalDate ld = LocalDate.ofEpochDay(365);  //1971-01-01,距离1970-01-01过了多少天


2 转换

字符串--->日期

LocalDate ld = LocalDate.parse("2017-11-28");  //参数是CharSequence接口,String是它的一个实现类,标准格式字符串

LocalDate ld = LocalDate.parse("28/11/2017",DateTimeFormatter.ofPattern("dd/MM/yyyy"));  //非标准格式

日期--->字符串

String s = LocalDate.now().toString();  //2017-11-28,标准格式

String s = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));  //2017年11月28日,非标准格式


3 获取分量

LocalDate ld = LocalDate.now();  //2017-11-28
  System.out.println(ld.getYear());  //2017,返回int
  System.out.println(ld.getMonth());  //NOVEMBER,返回Month类型,枚举值
  System.out.println(ld.getMonthValue());  //11,返回int
  System.out.println(ld.getDayOfYear());  //332,返回int
  System.out.println(ld.getDayOfMonth());  //28,返回int
  System.out.println(ld.getDayOfWeek());  //TUESDAY,返回DayOfWeek类型,枚举值

System.out.println(ld.toEpochDay());  //17498,1970-01-01到该时间过了多少天


4 更改分量

with开头方法,根据一个时间点更改

plus开头方法,根据一个时间段更改

minus开头方法,根据一个时间段更改


5 日期比较

isBefore()/isAfter()/isEqual()/equals()/compareTo()


6 LocalDate添加时分秒转为LocalDateTime

at开头方法


其它方法

LocalDate ld = LocalDate.now();  //2017-11-28
  System.out.println(ld.isLeapYear());  //false
  System.out.println(ld.lengthOfMonth());  //30
  System.out.println(ld.lengthOfYear());  // 365




<think>根据用户需求,用户希望将格式为'yyyy-MM-dd'的日期字符串转换为java.time.LocalDate对象。注意,用户明确要求的是LocalDate而不是LocalDateTime。 从引用内容来看,用户可能之前遇到了将'yyyy-MM-dd'字符串解析为LocalDateTime的问题(因为LocalDateTime需要时间部分),但现在用户要的是LocalDate,这是正确的做法,因为LocalDate只包含日期部分。 在Java 8及以上版本中,可以使用java.time.LocalDate类来解析仅包含日期部分的字符串。具体步骤如下: 1. 创建DateTimeFormatter对象,指定模式为"yyyy-MM-dd"(注意大小写,因为MM表示月份,dd表示日)。 2. 使用LocalDate.parse()方法,传入字符串和格式化器。 示例代码: ```java import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class StringToLocalDateExample { public static void main(String[] args) { String dateString = "2019-05-27"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(dateString, formatter); System.out.println(localDate); // 输出:2019-05-27 } } ``` 这样就不会抛出异常,因为LocalDate只需要日期部分,而字符串"2019-05-27"正好匹配。 另外,也可以使用预定义的DateTimeFormatter.ISO_LOCAL_DATE,因为"yyyy-MM-dd"是ISO格式的日期部分。所以也可以这样写: ```java LocalDate localDate = LocalDate.parse(dateString, DateTimeFormatter.ISO_LOCAL_DATE); ``` 或者,由于LocalDate.parse()默认使用ISO_LOCAL_DATE格式(即"yyyy-MM-dd"),所以对于符合该格式的字符串,可以直接解析: ```java LocalDate localDate = LocalDate.parse(dateString); // 直接解析,因为格式是标准的 ``` 但是,如果字符串的格式不是标准的,就必须使用自定义的DateTimeFormatter。 总结:对于'yyyy-MM-dd'格式的字符串,转换为LocalDate的最简单方法是使用`LocalDate.parse(String)`,因为它默认支持该格式。如果格式有变化,则需自定义格式器。 注意:用户之前引用的内容中提到了解析为LocalDateTime的问题,这是因为LocalDateTime需要日期时间两部分,而字符串只有日期部分。现在用户要求的是LocalDate,所以问题自然解决。 相关引用: - 引用[1]和[3]提到了将'yyyy-MM-dd'解析为LocalDateTime会抛出异常,因为缺少时间部分。而解析为LocalDate则不会。 - 引用[2]提到了Spring Boot中字符串转LocalDateTime的问题,同样是因为格式不匹配。 因此,用户的问题可以通过使用LocalDate.parse()方法解决。 </think> ### 将 'yyyy-MM-dd' 格式字符串转换为 `java.time.LocalDate` 的方法 在 Java 8 及以上版本中,使用 `java.time.LocalDate` 可直接解析符合 `yyyy-MM-dd` 格式的日期字符串。以下是具体方法: #### 1. **基础转换方法** ```java import java.time.LocalDate; public class DateConversion { public static void main(String[] args) { String dateStr = "2023-10-15"; // yyyy-MM-dd 格式字符串 // 直接解析为 LocalDate (默认支持 ISO 格式) LocalDate localDate = LocalDate.parse(dateStr); System.out.println(localDate); // 输出: 2023-10-15 } } ``` - **关键点**:`LocalDate.parse()` 默认使用 `DateTimeFormatter.ISO_LOCAL_DATE`,该格式器与 `yyyy-MM-dd` 完全兼容[^1]。 #### 2. **显式指定格式器(推荐)** 若需处理非标准格式或明确指定模式: ```java import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateConversion { public static void main(String[] args) { String dateStr = "2023-10-15"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(dateStr, formatter); System.out.println(localDate); // 输出: 2023-10-15 } } ``` - **优势**:避免隐式依赖,代码意图更清晰。 #### 3. **错误处理** 处理可能的格式异常: ```java try { LocalDate localDate = LocalDate.parse("2023/10/15"); // 错误格式 } catch (Exception e) { System.err.println("解析失败: " + e.getMessage()); // 实际处理:日志记录或返回默认值 } ``` ### ⚠️ 注意事项 1. **避免解析为 `LocalDateTime`** 直接解析 `yyyy-MM-dd` 到 `LocalDateTime` 会因缺少时间字段而抛出异常: ```java // 错误示例:解析为 LocalDateTime 会失败 LocalDateTime.parse("2023-10-15"); // 抛出 DateTimeParseException[^1][^3] ``` - **原因**:`LocalDateTime` 需要完整的日期时间信息。 2. **格式必须严格匹配** 若字符串格式不符(如 `yyyy/MM/dd`),需调整 `DateTimeFormatter` 的模式。 3. **空值处理** 传入 `null` 会抛出 `NullPointerException`,建议前置校验: ```java if (dateStr != null && !dateStr.isEmpty()) { LocalDate.parse(dateStr); } ``` ### 总结步骤 | 步骤 | 操作 | |------|------| | 1. | 确保输入字符串格式为 `yyyy-MM-dd` | | 2. | 使用 `LocalDate.parse(string)` 直接解析 | | 3. | 对非标准场景显式创建 `DateTimeFormatter` | > 通过此方法可高效转换日期字符串,避免常见的 `DateTimeException`[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值