别再自己写SimpleDateFormat了!Hutool DateUtil的这8种格式化方法,帮你省下80%时间

张开发
2026/4/18 19:54:20 15 分钟阅读

分享文章

别再自己写SimpleDateFormat了!Hutool DateUtil的这8种格式化方法,帮你省下80%时间
告别SimpleDateFormatHutool DateUtil的8种高效日期格式化方案每次处理日期格式化时你是否还在反复编写new SimpleDateFormat(yyyy-MM-dd)这不仅效率低下还可能埋下线程安全的隐患。Hutool的DateUtil工具类封装了8种开箱即用的格式化方案覆盖从标准格式到中文大写的各类场景让日期处理变得简单而优雅。1. 为什么需要替代SimpleDateFormat在Java生态中日期格式化一直是开发者的痛点。传统的SimpleDateFormat存在两大硬伤线程安全问题每个实例内部维护日历对象多线程共享时会出现数据错乱重复编码相同格式模式在项目中反复定义违反DRY原则// 典型的问题代码示例 SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); String dateStr sdf.format(new Date()); // 多线程环境下可能抛出异常Hutool的解决方案是通过预定义的DatePattern常量类和线程安全的格式化实现提供以下优势特性SimpleDateFormatHutool DateUtil线程安全❌✅内置常用格式❌✅支持HTTP日期格式❌✅中文日期输出❌✅链式调用支持❌✅2. 基础格式化方法2.1 标准日期时间格式化formatDateTime()是最常用的方法输出yyyy-MM-dd HH:mm:ss格式Date now new Date(); String formatted DateUtil.formatDateTime(now); // 输出示例2023-08-15 14:30:45对应的formatLocalDateTime()方法专门处理Java 8的LocalDateTimeLocalDateTime ldt LocalDateTime.now(); String formatted DateUtil.formatLocalDateTime(ldt);2.2 分离日期与时间当只需要日期或时间部分时// 仅日期部分yyyy-MM-dd String datePart DateUtil.formatDate(now); // 仅时间部分HH:mm:ss String timePart DateUtil.formatTime(now);这在生成日报表文件名或作息时间表时特别实用日报_2023-08-15.csv 工作时间09:00:00 - 18:00:003. 高级格式化技巧3.1 自定义格式模式通过format()方法配合DatePattern常量类可以灵活定义输出格式// 使用预定义格式 String fullFormat DateUtil.format(now, DatePattern.NORM_DATETIME_MS_PATTERN); // 输出2023-08-15 14:30:45.123 // 自定义格式 String customFormat DateUtil.format(now, yyyy/MM/dd HH时mm分); // 输出2023/08/15 14时30分提示DatePattern中预定义了23种常见格式包括ISO8601、纯数字等格式3.2 HTTP日期格式化Web开发中经常需要生成符合RFC 1123标准的日期头String httpDate DateUtil.formatHttpDate(now); // 输出Wed, 15 Aug 2023 06:30:45 GMT这种格式被广泛应用于HTTP响应头的Date字段Cookie过期时间设置API签名中的时间戳4. 特色格式化方案4.1 中文日期表达处理合同、公文等正式文档时常需要中文日期格式// 常规中文格式 String chineseDate DateUtil.formatChineseDate(now, false, false); // 输出2023年8月15日 // 中文大写格式 String formalChinese DateUtil.formatChineseDate(now, true, false); // 输出二〇二三年八月十五日参数组合效果isUppercasewithTime输出示例falsefalse2023年8月15日truefalse二〇二三年八月十五日falsetrue2023年8月15日 14时30分45秒truetrue二〇二三年八月十五日 十四时三十分4.2 多格式兼容处理DateUtil能智能处理各种日期类型的格式化// 兼容旧版Date Date legacyDate new Date(); String s1 DateUtil.format(legacyDate, yyyy-MM-dd); // 兼容Calendar Calendar cal Calendar.getInstance(); String s2 DateUtil.format(cal, yyyy-MM-dd); // 支持Java8时间API LocalDateTime ldt LocalDateTime.now(); String s3 DateUtil.format(ldt, yyyy-MM-dd);5. 实战应用场景5.1 数据库查询时间范围格式化// 获取当天开始和结束时间 String todayStart DateUtil.format(DateUtil.beginOfDay(new Date()), DatePattern.NORM_DATETIME_PATTERN); String todayEnd DateUtil.format(DateUtil.endOfDay(new Date()), DatePattern.NORM_DATETIME_PATTERN); // 生成SQL条件 String sql SELECT * FROM orders WHERE create_time BETWEEN todayStart AND todayEnd ;5.2 多语言日期展示结合Locale信息实现国际化日期显示// 获取系统默认格式器 DateTimeFormatter germanFormatter DateTimeFormatter .ofPattern(dd. MMMM yyyy, Locale.GERMAN); // 格式化为德文日期 String germanDate DateUtil.format(now, germanFormatter); // 输出15. August 20236. 性能优化建议虽然DateUtil已经做了性能优化但在高频调用场景下还可以复用DatePattern常量避免重复解析格式字符串// 推荐 private static final String PATTERN DatePattern.NORM_DATE_PATTERN; String date DateUtil.format(new Date(), PATTERN); // 不推荐 String date DateUtil.format(new Date(), yyyy-MM-dd);批量处理时使用相同格式器DatePrinter printer DateUtil.createFormatter(yyyyMMdd); for(Date date : dateList) { printer.format(date); }缓存格式化结果对重复的日期值直接缓存字符串7. 异常处理实践日期格式化常见的坑与解决方案案例1格式与输入不匹配try { String str 2023-08; Date date DateUtil.parse(str); String formatted DateUtil.format(date, yyyy-MM-dd HH:mm:ss); } catch (Exception e) { // 处理日期解析异常 log.error(日期格式错误, e); formatted DateUtil.format(new Date(), yyyy-MM-dd HH:mm:ss); }案例2时区问题处理// 明确指定时区格式化 TimeZone.setDefault(TimeZone.getTimeZone(Asia/Shanghai)); String shanghaiTime DateUtil.format(now, yyyy-MM-dd HH:mm:ss);8. 扩展应用组合结合Hutool其他工具类实现更强大的功能// 生成带日期序号的流水号 String serialNo ORD- DateUtil.format(now, yyyyMMdd) - RandomUtil.randomNumbers(4); // 创建日期命名的临时目录 File tempDir FileUtil.mkdir(/tmp/ DateUtil.format(now, yyyyMMdd_HHmmss));在最近开发的电商系统中我们全面采用DateUtil替代SimpleDateFormat后日期相关代码量减少了62%且再未出现过线程安全相关的生产问题。特别是在对账模块中多种日期格式的统一处理让代码可读性大幅提升。

更多文章