Java严格模式withResolverStyle解析日期错误及解决方案

在Java中使用DateTimeFormatter并启用严格模式(ResolverStyle.STRICT)时,解析日期字符串"2025-06-01"报错的根本原因是:模式字符串中的年份格式yyyy被解释为YearOfEra(纪元年份),而非Year(公历年份)。在严格模式下,解析器要求所有字段必须完整且一致,而LocalDate需要Year字段(而非YearOfEra)来构建对象,导致转换失败。

解决方案:使用uuuu代替yyyy

将模式中的年份占位符从yyyy改为uuuu,明确指定使用公历年份(Year字段):

java

复制

下载

private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); // 严格模式

原因详解

  1. 字段差异

    • yyyy → 解析为 YearOfEra(纪元年份),例如 2025 表示“公元2025年”。

    • uuuu → 解析为 Year(公历年份),直接对应ISO年份体系。

  2. 严格模式的要求

    • ResolverStyle.STRICT下,解析器不会自动补全缺失字段(如纪元信息)。

    • 错误信息中的TemporalAccessor包含:

      plaintext

      复制

      下载

      {DayOfMonth=1, MonthOfYear=6, YearOfEra=2025}, ISO

      缺少Year字段,只有YearOfEra,无法直接构建LocalDate

  3. uuuu的优势

    • 直接生成Year字段,与LocalDate所需字段一致。

    • 避免纪元歧义,尤其处理公元前/后的日期更安全。

验证修复后的代码

java

复制

下载

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;public class StrictDateParsing {private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); // 使用 uuuupublic static void main(String[] args) {String dateStr = "2025-06-01";LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER); // 解析成功System.out.println(date); // 输出: 2025-06-01}
}

关键结论

占位符含义严格模式下的行为
yyyy纪元年份解析为YearOfEra,导致构建失败
uuuu公历年份解析为Year,与LocalDate兼容

最佳实践
在严格模式中始终使用uuuu表示年份,确保日期字段与LocalDate的要求完全匹配,避免解析错误。

package com.weiyu.utils;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.ArrayList;
import java.util.List;public class DateUtils {// 标准模式// private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd")// 启用严格模式,使用 ResolverStyle.STRICT 严格模式,拒绝无效日期(如 2023-02-29),自动处理闰年、月份天数等复杂逻辑// 启用严格模式,ofPattern必设置为"uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT);/*** 有效检查* @param dateStr 字符串* @return 提示信息*/public static String isValidDate(String dateStr) {// 1. 空值检查if (dateStr == null) return "日期字符串不能为null";// 2. 空白检查if (dateStr.isEmpty()) {return "日期字符串不能为空";}return "";}/*** 转换为 LocalDate 格式的日期* @param dateStr 字符串* @return LocalDate 格式的日期*/public static LocalDate parseDate(String dateStr) {// 检查日期字符串格式String msg = isValidDate(dateStr);if (!msg.isEmpty()) {throw new RuntimeException(msg);}try {// 解析日期return LocalDate.parse(dateStr, DATE_FORMATTER);} catch (DateTimeParseException e) {// 格式错误处理throw new IllegalArgumentException("日期格式错误,应为 yyyy-MM-dd,并且为有效日期", e);}}/*** 转换为开始时间(当天的开始时刻 00:00:00)* @param dateStr 字符串* @return LocalDateTime 格式的日期时间*/public static LocalDateTime parseBeginDateTime(String dateStr) {return parseDate(dateStr).atStartOfDay();}/*** 转换为结束时间(当天的最后一刻 23:59:59.999999999)* @param dateStr 字符串* @return LocalDateTime 格式的日期时间*/public static LocalDateTime parseEndDateTime(String dateStr) {return parseDate(dateStr).atTime(LocalTime.MAX);}/*** 将字符数组转换为日期数组,如:["2025-06-01", "2026-06-10"] 转换为 [beginDate, endDate]* @param dateStrList 字符数组* @return 日期数组,只限开始日期和结束日期,[beginDate, endDate]*/public static List<LocalDate> parseDateRange(List<String> dateStrList) {List<LocalDate> dateList = new ArrayList<>();if (dateStrList == null || dateStrList.size() != 2) {dateList.add(LocalDate.now());dateList.add(LocalDate.now());} else {try {dateList.add(parseDate(dateStrList.get(0)));dateList.add(parseDate(dateStrList.get(1)));} catch (DateTimeParseException e) {dateList.add(LocalDate.now());dateList.add(LocalDate.now());}}// 检查日期逻辑关系,开始时间大于结束时间if (dateList.get(0).isAfter(dateList.get(1))) {LocalDate maxDate = dateList.get(0);dateList.set(0, dateList.get(1));dateList.set(1,maxDate);}return dateList;}/*** 将字符数组转换为日期数组,如:["2025-06-01", "2026-06-10"] 转换为 [beginDateTime, endDateTime]* @param dateStrList 字符数组* @return 时间数组,只限开始时间和结束时间,[beginDateTime, endDateTime]*/public static List<LocalDateTime> parseDateTimeRange(List<String> dateStrList) {List<LocalDate> dateList = parseDateRange(dateStrList);List<LocalDateTime> dateTimeList = new ArrayList<>();dateTimeList.add(dateList.get(0).atStartOfDay());dateTimeList.add(dateList.get(1).atTime(LocalTime.MAX));return dateTimeList;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的泛型底层是怎样的

Java 泛型深入底层原理解析&#xff1a;类型擦除与桥方法的真相 一、Java中的伪泛型 Java 从 JDK 1.5 引入泛型之后&#xff0c;大大提升了代码的类型安全性与可读性。但泛型的底层实现并不像 C 的模板机制那样是“真正的泛型”&#xff0c;Java 的泛型是伪泛型&#xff0c;在…

Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)

前言 无论是软件还是硬件的本质都是要解决IO问题&#xff08;输入、输出&#xff09;&#xff0c;再说回网络编程本质上都是基于TCP/UP的开发&#xff0c;socket是在此基础上做的扩展与封装&#xff0c;而Netty又是对socket做的封装。本文旨在通过相关案例对socket进行探讨。 一…

【大模型LLM学习】function call/agent学习记录

【大模型LLM学习】function call/agent学习记录 0 前言1 langchain实现function call2 调用本地模型3 微调本地模型3.1 few-shot调用Claude生成Q-A对3.2 tools格式3.3 agent微调格式3.4 swift微调 p.s. 0 前言 记录一下使用langchain做简单的function call/agent(或者说意图识别…

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…

Puppeteer测试框架 - Node.js

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】

compose 组件 ---无ui组件

在 Jetpack Compose 中&#xff0c;确实存在不直接参与 UI 渲染的组件&#xff0c;它们主要用于逻辑处理、状态管理或副作用控制。这些组件虽然没有视觉界面&#xff0c;但在架构中扮演重要角色。以下是常见的非 UI 组件及其用途&#xff1a; 1. 无 UI 的 Compose 组件分类 (…

图像超分辨率

图像超分辨率 用AI当“像素侦探”&#xff0c;从模糊中重建合理高清细节&#xff0c;让看不见的细节“无中生有”。 举个生活例子 假设你有一张模糊的老照片&#xff0c;通过超分辨率技术&#xff0c;它能变成清晰的高清照片&#xff1a; 低分辨率图像超分辨率结果 传统放…

多线程语音识别工具

软件介绍 本文介绍一款支持大厂接口的语音转文字工具&#xff0c;具备免配置、免费使用的特点。 软件特性 该工具是一款完全免费的桌面端应用程序&#xff0c;部署于开源社区平台&#xff0c;其核心优势在于整合了多家技术供应商的接口资源。 操作方式 用户只需将音频…

金融预测模型开发:数据预处理、机器学习预测与交易策略优化

金融预测模型开发:数据预处理、机器学习预测与交易策略优化 概述 本文将详细介绍一个完整的金融预测模型开发流程,包含数据预处理、机器学习预测和交易策略优化三个核心模块。我们使用Python实现一个端到端的解决方案,适用于股票价格预测和量化交易策略开发。 # 导入必要…

triton学习笔记7: GEMM相关

这是之前的学习笔记 triton puzzles part1triton puzzles part2triton puzzles part3triton tutorials part1triton tutorials: part2triton tutorails: part3 这是triton tutorials里最后一篇关于GEMM的系列了 GEMM的知识可以参考这篇&#xff0c;写的非常详细具体https://…

食养有方:进行性核上性麻痹患者的健康饮食指南

进行性核上性麻痹是一种罕见的神经系统变性疾病&#xff0c;患者常出现吞咽困难、肢体运动障碍等症状&#xff0c;合理的饮食安排不仅能保证营养供给&#xff0c;还能缓解不适&#xff0c;提高生活质量。以下是适合这类患者的健康饮食建议。 ​患者饮食应遵循 “均衡、细软、易…

使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.

使用ORM Bee (ormbee) &#xff0c;如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型&#xff0c;修改依赖为&#xff1a; from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单&#xff0c;主要是两个接口。 db.create_all(True) #创建所有模型的表…

C# 使用正则表达式

C# 使用正则表达式 /// <summary> /// 测试正则表达式 /// </summary> private static void test022() {//检查是否匹配&#xff1a;Regex.IsMatch(currencyValue, pattern); 或 new Regex(...).IsMatch(currencyValue)string pattern "\d{3,}";bool b…

LLMs之RLVR:《Absolute Zero: Reinforced Self-play Reasoning with Zero Data》翻译与解读

LLMs之RLVR&#xff1a;《Absolute Zero: Reinforced Self-play Reasoning with Zero Data》翻译与解读 导读&#xff1a;Absolute Zero范式通过让模型在没有外部数据的情况下&#xff0c;自主提出和解决任务&#xff0c;实现了推理能力的显著提升。Absolute Zero Reasoner (AZ…

信息最大化(Information Maximization)

信息最大化在目标域无标签的域自适应任务中&#xff0c;它迫使模型在没有真实标签的情况下&#xff0c;对未标记数据产生高置信度且类别均衡的预测。此外&#xff0c;这些预测也可以作为伪标签用于自训练。 例如&#xff0c;在目标域没有标签时&#xff0c;信息最大化损失可以…

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法

目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection ​步骤3:DoIP模块为Gateway新增LA/TA/SA ​步骤4:PDUR模…

设备驱动与文件系统:05 文件使用磁盘的实现

从文件使用磁盘的实现逻辑分享 我们现在讲第30讲&#xff0c;内容是文件使用磁盘的具体实现&#xff0c;也就是相关代码是如何编写的。上一节我们探讨了如何从字符流位置算出盘块号&#xff0c;这是文件操作磁盘的核心。而这节课&#xff0c;我们将深入研究实现这一核心功能的…

【PCIe总线】-- inbound、outbound配置

PCI、PCIe相关知识整理汇总 【PCIe总线】 -- PCI、PCIe相关实现 由之前的PCIe基础知识可知&#xff0c;pcie的组成有&#xff1a;RC&#xff08;根节点&#xff09;、siwtch&#xff08;pcie桥&#xff09;、EP&#xff08;设备&#xff09;。 RC和EP&#xff0c;以及EP和EP能…

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…

AIGC 基础篇 Python基础 02

1.bool类型 书接上回&#xff0c;我们上次最后讲了三大数据类型&#xff0c;除了这三个之外&#xff0c;Python也有bool类型&#xff0c;也就是True和False。 a 2 print(a1) print(a2) 像这里&#xff0c;输出的内容第一个是False&#xff0c;因为a的值为2&#xff0c;而第…