java字符串格式化成日期_SimpleDateFormat与DateTimeFormatter指南
发布时间 - 2026-02-02 00:00:00 点击率:次应优先使用线程安全的DateTimeFormatter并设为static final,避免SimpleDateFormat多线程共享;严格校验格式、关闭宽松解析、对齐时区与数据库类型。
SimpleDateFormat 解析字符串时抛出 ParseException 怎么办
根本原因通常是输入字符串与模式不严格匹配,比如年份少写一位、空格或多了一个字母。它对格式极其敏感,且不是线程安全的——多线程共用同一个 SimpleDateFormat 实例是常见崩溃源头。
实操建议:
- 每次解析都新建实例,或用
ThreadLocal封装 - 确认模式字符串和输入完全对齐:
"yyyy-MM-dd"不能匹配"2025-1-1"(月份/日期缺零) - 用
setLenient(false)关闭宽松解析,避免把"2025-13-01"错误转成 2025-01-01 - 注意时区:默认使用 JVM 本地时区,若需 UTC,得显式调用
setTimeZone(TimeZone.getTimeZone("UTC"))
DateTimeFormatter.parse() 返回 LocalDateTime 还是 ZonedDateTime
取决于你用的 pattern 和输入字符串是否含时区信息。没有时区字段(如 "HH:mm:ss" 或 "yyyy-MM-dd")时,parse() 默认返回 LocalDateTime;若输入含 Z、+0800 或时区名(如 "2025-05-20T14:30:00+08:00"),则必须用 ZonedDateTime.parse() 或指定带时区的 formatter。
实操建议:
- 用
DateTimeFormatter.ISO_OFFSET_DATE_TIME解析带偏移的时间,别硬套ISO_LOCAL_DATE_TIME - 想统一转成带时区的时间?先 parse 成
LocalDateTime,再用.atZone(ZoneId.of("Asia/Shanghai")) - 自定义 pattern 时,
XXX匹配+08:00,XX匹配+0800,X匹配+08,别混用
从字符串转日期后,为什么存进数据库时间不对
最常踩的坑是:Java 端用了 LocalDateTime(无时区),但数据库字段是 TIMESTAMP WITH TIME ZONE(如 PostgreSQL),JDBC 驱动会按 JVM 本地时区自动转换,导致值偏移。
实操建议:
- 数据库字段类型和 Java 类型要对齐:
DATE→LocalDate,TIMESTAMP→LocalDateTime,TIMESTAMP WITH TIME ZONE→ZonedDate或
Time
OffsetDateTime - 用 JDBC 4.2+ 时,直接传
OffsetDateTime.now(ZoneOffset.UTC),别依赖Timestamp.valueOf(LocalDateTime) - Spring Boot + MyBatis 中,确保配置了
spring.jackson.time-zone=UTC和spring.jackson.date-format=yyyy-MM-dd HH:mm:ss,否则序列化可能悄悄加本地时区
性能对比:SimpleDateFormat vs DateTimeFormatter
DateTimeFormatter 是不可变且线程安全的,创建开销略高但复用无风险;SimpleDateFormat 创建快,但并发下必须加锁或隔离,实际吞吐反而更低。
实操建议:
- 高频解析场景(如日志时间提取),把
DateTimeFormatter声明为static final,例如:private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") - 不要在循环里 new
SimpleDateFormat——哪怕只用一次,也比复用一个非线程安全实例更安全 - 如果必须兼容 JDK 7,且无法升级,至少用
ThreadLocal包一层,别图省事共享实例
真正麻烦的不是语法,而是时区、leniency、JDBC 类型映射这三块的隐式行为。它们不会报错,但会在某个凌晨三点让数据差八小时。
# java
# ai
# yy
# 为什么
# spring
# spring boot
# jvm
# mybatis
# Static
# 封装
# date
# format
# timestamp
# 字符串
# 循环
# private
# 线程
# 多线程
# 并发
# postgresql
# 数据库
# 转成
# 复用
# 设为
# 会在
# 用了
# 自定义
# 要对
# 三点
# 再用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作企业网站建设方案,怎样建设一个公司网站?
长沙做网站要多少钱,长沙国安网络怎么样?
如何在新浪SAE免费搭建个人博客?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何配置任务调度?(Cron Job示例)
Python制作简易注册登录系统
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何快速搭建高效香港服务器网站?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
零服务器AI建站解决方案:快速部署与云端平台低成本实践
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
如何在阿里云高效完成企业建站全流程?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何在云主机上快速搭建多站点网站?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Android滚轮选择时间控件使用详解
新三国志曹操传主线渭水交兵攻略
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何创建自定义Facades?(详细步骤)
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何安全更换建站之星模板并保留数据?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何实现多对多模型关联?(Eloquent教程)
Windows Hello人脸识别突然无法使用
Linux网络带宽限制_tc配置实践解析【教程】
如何快速查询网站的真实建站时间?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
详解Android中Activity的四大启动模式实验简述
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
香港服务器WordPress建站指南:SEO优化与高效部署策略
历史网站制作软件,华为如何找回被删除的网站?
如何在香港免费服务器上快速搭建网站?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
EditPlus 正则表达式 实战(3)
php json中文编码为null的解决办法
如何在云指建站中生成FTP站点?
javascript日期怎么处理_如何格式化输出
教学论文网站制作软件有哪些,写论文用什么软件
?
用yum安装MySQLdb模块的步骤方法
如何用已有域名快速搭建网站?
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)


