Java中日期和字符串的处理

📅 2026/7/23 10:28:17
Java中日期和字符串的处理
前言在 Java 中日期Date/Time和字符串String之间的转换是开发中最常见的操作之一。随着 Java 版本的演进处理方式发生了巨大变化。强烈建议使用 Java 8 引入的 java.time 包新日期 API它比旧的 java.util.Date 更安全、更简洁、线程安全。 推荐方案Java 8 (java.time)这是现代 Java 开发的标准做法。主要涉及三个类1.LocalDateTime: 本地日期时间最常用如 2023-10-27T10:30:00。2.LocalDate: 仅日期如 2023-10-27。3.DateTimeFormatter: 格式化工具线程安全替代旧的 SimpleDateFormat。1. 字符串 ➡️ 日期 (String to Date)importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateDemo{publicstaticvoidmain(String[]args){// 定义格式年-月-日 时:分:秒DateTimeFormatterformatterDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);StringdateStr2023-10-27 14:30:00;// 解析字符串为 LocalDateTimeLocalDateTimelocalDateTimeLocalDateTime.parse(dateStr,formatter);System.out.println(localDateTime);// 输出: 2023-10-27T14:30}}注意⚠️如果字符串格式与 ofPattern 不完全匹配比如多了一个空格会抛出 DateTimeParseException。2. 日期 ➡️ 字符串 (Date to String)importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateDemo{publicstaticvoidmain(String[]args){LocalDateTimenowLocalDateTime.now();// 定义格式DateTimeFormatterformatterDateTimeFormatter.ofPattern(yyyy/MM/dd HH:mm:ss);// 格式化日期为字符串StringdateStrnow.format(formatter);System.out.println(dateStr);// 输出: 2023/10/27 14:35:12}}3. 常见格式模式符号符号含义示例y年yyyy - 2023M月MM - 10, MMM - Octd日dd - 27H时24小时制H 时 (24小时制) HH - 14h时12小时制h 时 (12小时制) hh - 02m分mm - 30s秒ss - 00S毫秒SSS - 123⚠️ 旧方案Java 8 之前 (java.util.Date)如果你维护老项目可能会遇到 Date 和 SimpleDateFormat。❌ 缺点线程不安全SimpleDateFormat 在多线程环境下会出错必须每次 new 一个或使用 ThreadLocal。API难用月份从 0 开始1月是 0年份从 1900 开始计算等示例不推荐但需了解importjava.text.SimpleDateFormat;importjava.util.Date;// 1. Date - StringDatedatenewDate();SimpleDateFormatsdfnewSimpleDateFormat(yyyy-MM-dd HH:mm:ss);Stringstrsdf.format(date);// 2. String - DateStringdateStr2023-10-27 14:30:00;DateparsedDatesdf.parse(dateStr);// 需要处理 ParseException计算时间差的例子Java 8LocalDateTimestartLocalDateTime.of(2023,10,1,10,0);LocalDateTimeendLocalDateTime.of(2023,10,5,12,0);longdaysjava.time.temporal.ChronoUnit.DAYS.between(start,end);System.out.println(相差天数: days);// 输出: 4下面的实战可以不看---------------------------------------------------------------------------------------------------------------实战场景针对TodoList案例通常不需要手动转换因为框架会自动处理。1. 数据库字段类型建议MySQL 中使用 DATETIME 或 TIMESTAMP。Java 实体类中使用 LocalDateTime。DataTableName(todo)publicclassTodo{TableIdprivateLongid;privateStringtitle;// MP 会自动将数据库的 DATETIME 映射为 LocalDateTimeprivateLocalDateTimecreateTime;privateLocalDateTimeupdateTime;}2. 前端传参JSON前端通常传递字符串格式的日期如 “2023-10-27T14:30:00” 或 “2023-10-27 14:30:00”。Spring Boot 默认支持 ISO 格式yyyy-MM-dd’T’HH:mm:ss。如果前端传的是自定义格式如 yyyy-MM-dd HH:mm:ss你需要配置全局转换器方式一在 application.yml 中配置推荐spring:jackson:date-format:yyyy-MM-dd HH:mm:sstime-zone:GMT8方式二使用注解针对特定字段DatapublicclassCreateTodoDTO{privateStringtitle;// 指定反序列化时的格式JsonFormat(patternyyyy-MM-dd HH:mm:ss,timezoneGMT8)privateLocalDateTimeexpectedTime;}总结新项目开发 全程使用 java.time.LocalDateTime DateTimeFormatter老项目维护 尽量重构为Java 8 时间 API若不能注意 SimpleDateFormat 的线程安全问题数据库交互 实体类用LocalDateTimeMP 自动映射前后端交互 统一使用 ISO 8601 格式或配置 Jackson 全局格式计算时间差 使用Duration.between(start, end) 或 ChronoUnit.DAYS.between(d1, d2)