当前位置: 首页 > article >正文

Java中灵活转换日期时间字符串格式的教程

本教程详细介绍了如何使用Java Java8及更高版本.time API准确地将各种不同格式的日期时间字符串转换为统一”DD.MM.YYYY“格式。本文强调了现代日期时间API的优势分析了Datetimeformater模式符号的正确使用并提供了完整的示例代码和最佳实践以处理带有时区信息、本地时间和非标准格式字符串以帮助开发者避免常见的格式分析错误。Java日期时间字符串格式转换从多种输入到统一输出在java开发中处理日期时间字符串的格式转换是一项常见但容易出错的任务。应用程序可以从不同的来源接收不同格式的日期时间字符串如RFC标准格式、包含时间信息的简单本地日期时间格式甚至一些非标准的自定义格式。将这些多样化的输入统一转换为特定的输出格式例如”dd.mm.yyyy)需要准确的分析和格式化策略。本教程将深入探讨如何使用java java引入8.time包(也叫jsrre包) 310)高效准确地完成这项任务避免传统的java.util.date和simpledateformat带来的陷阱。为什么选择 java.time API传统的java.util.Date和SimpleDateFormat在设计上存在线程不安全、可变性问题、日期时间概念模糊等缺点。java.time API提供了一套新的、不可变的、安全的线程类别如LocalDatee、LocalTime、LocalDateTime、OffsetdatetimeZonedDateTime它们清楚地划分了日期、时间、时间等概念大大简化了日期时间处理。在分析和格式化日期时间字符串时强烈建议优先使用java.time API及其配套DatetimeFormater。理解 DateTimeFormatter 模式符号Datetimeformaterjava.time API中用于分析和格式化日期时间字符串的核心工具。正确使用其模式符号非常重要。以下是一些常见的符号及其含义d: 月中天数(1-31)单数不补零。dd: 月中的天数(01-31)两位数不足以补零。M: 年中月(1-12)单数不补零。MM: 一年中的月份(01-12)两位数不足以弥补零。MMM: 月缩写名(如Jan Feb。MMMM: 月份的完整名称(如January February。u / uu / uuuu: 年份。建议使用uuuuu表示四个年份以避免千年虫问题。YYY表示基于周年通常不用于普通日期。H / HH: 小时(0-23)H单数不补零H两位数不补零。m / mm: 分钟(0-59)m单数字不补零mm两位数字补零。s / ss: 秒(0-59)s单数字不补零ss两位数字补零。x: 时区偏移量(如0100)。EEE: 星期几缩写名(如Mon Tue。常见错误提示 Text Sun, 30 Oct 2022 00:30:00 0200 could not be parsed at index 0 这个错误通常意味着您尝试使用一个不匹配输入字符串的模式进行分析。例如如果输入字符串从Sun开始但您的模式是dd.MM.uuuu然后分析器希望字符串从数字开始导致分析失败。此外D代表一年中的第几天1-366Y代表基于周的年份。它们不同于我们通常理解的“日期”和“年份”符号因此在使用时应特别注意。处理不同格式的输入字符串将不同格式的日期时间字符串统一转换为“”dd.MM.uuuu“格式我们需要为每个输入格式创建相应的Dateteformater进行分析然后使用统一的Dateteformater进行输出格式化。示例场景及解决方案假设我们需要处理以下两种常见的输入字符串格式并将其转换为dd.MM.uuuuRFC具有时区偏移量的RFC 1123-like格式 Thu, 3 Nov 2022 06:00:00 0100本地日期时间格式 01.11.2022 20:00:00非标准或混淆格式 9.28.2022 6:30:00 (例如月份和日期的顺序可能会逆转)以下是具体的实现步骤和代码示例import java.time.LocalDate; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Locale; public class DateTimeConverter { public static void main(String[] args) { // 例子输入字符串 String firstInput Thu, 3 Nov 2022 06:00:00 0100; String secondInput 01.11.2022 20:00:00; String thirdInput 9.28.2022 6:30:00; // 非标准格式要注意月份和日期的顺序 // 1. 定义目标输出格式 DateTimeFormatter outputFormatter DateTimeFormatter.ofPattern(dd.MM.uuuu); // --- 处理第一种输入格式 Thu, 3 Nov 2022 06:00:00 0100 --- // 这种格式包括周几、月缩写和时区偏移。 // 由于包含英文文本可以使用自定义模式并指定Locale。 // 由于包含英文文本可以使用自定义模式并指定Locale。 // 或者使用内置RFC_1123_DATE_TIME格式。 try { // 方法1:自定义DatetimeFormater DateTimeFormatter dtfInFirstCustom DateTimeFormatter.ofPattern( EEE, d MMM uuuu HH:mm:ss x, Locale.ENGLISH ); OffsetDateTime odt OffsetDateTime.parse(firstInput, dtfInFirstCustom); // 提取日期部分格式化 String formattedFirst odt.toLocalDate().format(outputFormatter); System.out.println(firstInput --- formattedFirst); // 方法二:使用内置RFC_1123_DATE_TIME格式(更简单) OffsetDateTime odtBuiltIn OffsetDateTime.parse(firstInput, DateTimeFormatter.RFC_1123_DATE_TIME); String formattedFirstBuiltIn odtBuiltIn.toLocalDate().format(outputFormatter); System.out.println(firstInput (内置格式) --- formattedFirstBuiltIn); } catch (DateTimeParseException e) { System.err.println(解析 firstInput 失败: e.getMessage()); } System.out.println(------------------------------------); // --- 处理第二种输入格式 01.11.2022 20:00:00 --- // 本格式为本地日期时间不包括时区信息。 try { DateTimeFormatter dtfInSecond DateTimeFormatter.ofPattern(dd.MM.uuuu HH:mm:ss); LocalDateTime ldt LocalDateTime.parse(secondInput, dtfInSecond); // 提取日期部分格式化 String formattedSecond ldt.toLocalDate().format(outputFormatter); System.out.println(secondInput --- formattedSecond); } catch (DateTimeParseException e) { System.err.println(解析 secondInput 失败: e.getMessage()); } System.out.println(------------------------------------); // --- 处理第三种输入格式 9.28.2022 6:30:00 --- // 这种格式需要特别注意月份和日期的顺序。根据示例9.28这意味着9月28日。 // 此外小时和月份可能是单数字。 try { DateTimeFormatter dtfInThird DateTimeFormatter.ofPattern(M.d.uuuu H:mm:ss); LocalDateTime ldtThird LocalDateTime.parse(thirdInput, dtfInThird); // 提取日期部分格式化 String formattedThird ldtThird.toLocalDate().format(outputFormatter); System.out.println(thirdInput --- formattedThird); } catch (DateTimeParseException e) { System.err.println(解析 thirdInput 失败: e.getMessage()); } } }代码输出Thu, 3 Nov 2022 06:00:00 0100 --- 03.11.2022 Thu, 3 Nov 2022 06:00:00 0100 (内置格式) --- 03.11.2022 ------------------------------------ 01.11.2022 20:00:00 --- 01.11.2022 ------------------------------------ 9.28.2022 6:30:00 --- 28.09.2022注意事项和最佳实践始终优先使用 java.time API 避免使用过时的java.util.Date和SimpleDateFormat。输入模式的精确匹配 Datetimeformatter的模式必须与输入字符串的结构精确匹配。任何不匹配(例如期望数字得到文本或模式符号意义错误)都会导致Datetimeparseexception。处理带时区信息的时间 如果输入字符串包含时区或时区偏差(如0100)则应使用OffsetDateTime或ZonedDateTime进行分析而不是LocalDateTime以避免信息丢失。指定 Locale 当日期字符串包含月份或周几的文本名称时(如Nov)、Thu在创建DatetimeFormater时必须指定相应的Locale(如Locale).ENGLISH确保正确的分析。分析与格式分离 如果输入格式和输出格式不同应创建两个独立的Datetimeformater实例一个用于分析输入字符串另一个用于格式化输出结果。非标准格式处理 对于不常见或可能存在歧义的格式(如M.d.uuuu输入字符串的结构需要仔细分析模式需要根据实际情况进行调整如日期/月/小时区分单数字和双数字。异常处理 在分析日期时间字符串时必须捕获DatetimeParseeexception以便在分析失败时进行适当的错误处理。总结通过这个教程我们学习了如何使用java.time API及其强大的Datetimeformater处理各种日期时间字符串的转换需求。理解模式符号的正确用法区分不同类型的日期时间对象(如Offsetdatetime和Localdatetime)必要时指定Locale是日期时间格式转换成功的关键。遵循这些最佳实践可以保证代码的强度、可读性和准确性从而更有效地管理应用程序中的日期时间数据。

相关文章:

Java中灵活转换日期时间字符串格式的教程

本教程详细介绍了如何使用Java Java8及更高版本.time API,准确地将各种不同格式的日期时间字符串转换为统一”DD.MM.YYYY“格式。本文强调了现代日期时间API的优势,分析了Datetimeformater模式符号的正确使用,并提供了完整的示例代码和最佳实…...

JVM堆内存泄漏排查:从-Xmx设置到hprof文件分析的完整避坑指南

JVM堆内存泄漏排查:从参数配置到实战分析的完整方法论 最近在排查一个线上服务的内存泄漏问题时,我发现很多开发者对JVM内存问题的处理还停留在"遇到OOM就重启服务"的初级阶段。实际上,一套系统化的内存排查方法论不仅能快速定位问…...

Java中高效移除文本文件标点符号的实用指南

本教程详细阐述了在Java中从文本文件中有效删除标点符号的方法。我们将使用Java NIO的Files.lines()结合Streamm API,重点介绍正则表达式p{Punct}强大的功能,以简单、强大的方式实现文本清洁,避免传统硬编码的局限性,从而提高文本…...

CosyVoice Docker 部署优化:如何有效降低 CPU 占用率

在语音合成服务日益普及的今天,CosyVoice 凭借其出色的音质和灵活性,成为了许多开发者的选择。然而,当我们将它部署到 Docker 容器中时,一个普遍且棘手的问题随之而来:CPU 占用率居高不下。这不仅导致服务器资源成本飙…...

DanKoe 视频笔记:数字经济学:未来职业之路:从工作到游戏 [特殊字符]

在本节课中,我们将探讨未来职业发展的核心范式转变。我们将学习如何将个人好奇心转化为可持续的在线事业,并理解构建个人品牌与数字资产的底层逻辑。 在过去的一个月里,我意识到我生活中以及许多人生活中的一个共同主题:痴迷。 童…...

DanKoe 视频笔记:生活哲学:理解生活的三个阶段

在本节课中,我们将学习一个关于个人成长与生活节奏的框架。通过理解“强度”、“一致性”和“好奇心”这三个循环往复的阶段,你可以更好地定位自己当前的状态,并学会顺应而非对抗生活的自然周期,从而减少迷茫,更有效地…...

别再只用Cesium了!Three.js + Cesium 1.8 整合实战:从零搞定天地图中文底图与BIM模型加载

Three.js与Cesium 1.8深度整合实战:天地图中文底图与BIM模型加载全解析 当我们需要在三维地理信息系统中同时展示宏观地理环境和精细建筑内部结构时,单独使用Cesium或Three.js往往难以完美兼顾。本文将带你完成一次技术栈的深度整合,解决国内…...

CosyVoice Docker Compose 中 model_id 的高效配置与优化实践

最近在部署 CosyVoice 语音服务时,我发现 docker-compose.yml 文件里的 model_id 配置项,虽然看起来只是简单的一行,但配置得当与否,直接关系到整个服务的部署效率、启动速度和资源开销。如果随便填一个值,或者不理解其…...

Timer-S1 正式发布:首个十亿级时序基础模型,预测性能达到 SOTA

本文约3600字,建议阅读5分钟十亿级规模化的突破,首次将时间序列预测的串行本质,融入模型架构、数据、训练全流程!在 AI 全面渗透各行业的背景下,工业企业对时序数据的应用需求已从基础查询计算,升级为设备状…...

ChezScheme测试性能优化:从53分钟到8分钟的效率跃迁

ChezScheme测试性能优化:从53分钟到8分钟的效率跃迁 【免费下载链接】ChezScheme Chez Scheme 项目地址: https://gitcode.com/gh_mirrors/ch/ChezScheme 一、痛点分析:串行测试的性能瓶颈 识别测试效率问题 在软件开发迭代过程中,…...

音频可视化工具:Lano Visualizer打造沉浸式桌面音乐体验

音频可视化工具:Lano Visualizer打造沉浸式桌面音乐体验 【免费下载链接】Lano-Visualizer A simple but highly configurable visualizer with rounded bars. 项目地址: https://gitcode.com/gh_mirrors/la/Lano-Visualizer 在数字生活中,音乐不…...

Verilog中的strength到底有什么用?一个案例带你理解强弱驱动的实际应用

Verilog中的strength到底有什么用?一个案例带你理解强弱驱动的实际应用 在数字电路设计中,Verilog作为硬件描述语言的标杆,其精确建模能力直接影响仿真结果的可靠性。而strength(强度)这一常被忽视的特性,恰…...

ROS2 MoveIt2实战:如何让虚拟机械臂‘看懂’并抓取YOLOv8 OBB识别的物体?

ROS2 MoveIt2与YOLOv8 OBB深度集成:构建高精度虚拟抓取系统的核心技术解析 当机械臂遇上计算机视觉,一场关于精准控制的交响乐就此展开。本文将带您深入探索如何利用YOLOv8 OBB(Oriented Bounding Box)的朝向感知能力,…...

用Arduino UNO R3和面包板,从零组装你的第一台meArm机械臂(附电源模块避坑指南)

用Arduino UNO R3和面包板,从零组装你的第一台meArm机械臂(附电源模块避坑指南) 当你第一次看到meArm机械臂灵活抓取物体的视频时,是否也想过自己动手组装一台?作为开源硬件领域的经典项目,meArm以其精巧的…...

HunyuanVideo-Foley实战案例:为AI生成视频自动匹配Foley音效工作流

HunyuanVideo-Foley实战案例:为AI生成视频自动匹配Foley音效工作流 1. 项目背景与价值 在视频制作领域,Foley音效(环境音、动作音效等)的创作往往需要专业录音设备和大量人工处理。HunyuanVideo-Foley创新性地将视频生成与音效生…...

5步打造企业级数字人创作平台:从本地化部署到场景落地全指南

5步打造企业级数字人创作平台:从本地化部署到场景落地全指南 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 一、价值定位:数字人技术的企业级应用价值 核心价值:Duix.Avatar通过全本…...

终极实战指南:在Docker容器中运行Windows系统的完整解决方案

终极实战指南:在Docker容器中运行Windows系统的完整解决方案 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 还在为Windows虚拟机占用大量系统资源而烦恼吗?想体验在容…...

DAMO-YOLO部署教程:SSL证书配置与HTTP自动跳转HTTPS设置

DAMO-YOLO部署教程:SSL证书配置与HTTP自动跳转HTTPS设置 1. 引言 当你成功部署了DAMO-YOLO智能视觉探测系统后,可能会发现浏览器提示"不安全"的警告。这是因为默认的HTTP协议缺乏加密保护,对于涉及图像处理的AI系统来说&#xff…...

最完整的llm-graph-builder入门指南:从安装到知识图谱可视化

最完整的llm-graph-builder入门指南:从安装到知识图谱可视化 【免费下载链接】llm-graph-builder Neo4j graph construction from unstructured data 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-graph-builder 你还在为非结构化数据转化为结构化…...

Dify插件安装全攻略:从在线市场到离线部署的完整实践

1. Dify插件安装前的准备工作 在开始安装Dify插件之前,我们需要先了解几个关键概念。Dify 1.0.0版本之后,所有工具和模型供应商都改为了插件形式,这意味着我们需要掌握插件的安装方法才能充分发挥Dify的功能。插件主要分为五大类&#xff1a…...

如何5步完成Unity游戏模组加载:MelonLoader终极指南

如何5步完成Unity游戏模组加载:MelonLoader终极指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 想要为心爱的Un…...

成本对比实测:OpenClaw本地部署Qwen3.5-9B比API节省40%

成本对比实测:OpenClaw本地部署Qwen3.5-9B比API节省40% 1. 为什么我要做这个测试 上个月我给自己定了个目标:用OpenClaw实现个人知识库的自动化更新。这个任务需要每天抓取20篇行业文章,提取关键信息,整理成结构化笔记。最初我直…...

TranslucentTB:轻量任务栏视觉增强工具,让Windows桌面颜值提升300%

TranslucentTB:轻量任务栏视觉增强工具,让Windows桌面颜值提升300% 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB …...

ICML 2023亚马逊论文速览:自适应计算与差分隐私

机器学习 某机构在ICML 2023会议论文速览 在一系列主题中,某机构的研究融合了理论与实践的探索。 会议 ICML 2023 在今年的国际机器学习大会(ICML)上,某机构的研究人员发表了多篇关于赌博机问题和差分隐私的论文,这两个…...

BilibiliDown:你的专属B站视频管家,轻松下载与管理海量内容

BilibiliDown:你的专属B站视频管家,轻松下载与管理海量内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.…...

ESP8266 KiCAD库零基础上手:高效配置开源硬件设计工具指南

ESP8266 KiCAD库零基础上手:高效配置开源硬件设计工具指南 【免费下载链接】kicad-ESP8266 Schematic symbols and PCB footprints for ESP8266 modules 项目地址: https://gitcode.com/gh_mirrors/ki/kicad-ESP8266 在开源硬件设计领域,KiCAD库&…...

AI辅助开发中的Codec VAD优化实践:从算法原理到工程落地

在实时音视频应用里,语音活动检测(VAD)就像个“守门员”,负责精准判断当前有没有人在说话。这个判断准不准、快不快,直接关系到后续的编码、传输乃至降噪、唤醒等一系列流程的效率。尤其在AI辅助开发的框架下&#xff…...

基于dify智能客服助手的yml配置实战:从零搭建高可用对话系统

在智能客服领域,快速响应和精准理解用户意图是核心诉求。然而,传统基于硬编码或复杂数据库配置的客服系统,往往面临开发周期长、业务逻辑调整困难、多环境部署繁琐等痛点。每次新增一个业务场景,都需要开发人员介入修改代码、测试…...

3大创新突破:FlashPatch如何让Flash内容重获新生

3大创新突破:FlashPatch如何让Flash内容重获新生 【免费下载链接】FlashPatch FlashPatch! Play Adobe Flash Player games in the browser after January 12th, 2021. 项目地址: https://gitcode.com/gh_mirrors/fl/FlashPatch 如何解决2021年后Flash内容无…...

B2B品牌战略方法拆解:客户层、业务层、价值层、证据层怎么串起来

一个有点反常识的判断是:真正拉开差距的,常常不是你有多少材料、多少动作、多少名字,而是你能不能先把最关键的判断结构做出来。B2B品牌战略一旦结构对了,后面的内容、渠道和场景才会越做越顺。B2B品牌战略是什么:围绕…...