电话
400 9058 355
应优先使用线程安全的DateTimeFormatter并设为static final,避免SimpleDateFormat多线程共享;严格校验格式、关闭宽松解析、对齐时区与数据库类型。
ParseException 怎么办根本原因通常是输入字符串与模式不严格匹配,比如年份少写一位、空格或多了一个字母。它对格式极其敏感,且不是线程安全的——多线程共用同一个 SimpleDateFormat 实例是常见崩溃源头。
实操建议:
ThreadLocal 封装"yyyy-MM-dd" 不能匹配 "2025-1-1"(月份/日期缺零)setLenient(false) 关闭宽松解析,避免把 "2025-13-01" 错误转成 2025-01-01setTimeZone(TimeZone.getTimeZone("UTC"))
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
LocalDateTime,再用 .atZone(ZoneId.of("Asia/Shanghai"))
XXX 匹配 +08:00,XX 匹配 +0800,X 匹配 +08,别混用最常踩的坑是:Java 端用了 LocalDateTime(无时区),但数据库字段是 TIMESTAMP WITH TIME ZONE(如 PostgreSQL),JDBC 驱动会按 JVM 本地时区自动转换,导致值偏移。
实操建议:
DATE → LocalDate,TIMESTAMP → LocalDateTime,TIMESTAMP WITH TIME ZONE → ZonedDateTime 或 OffsetDateTime
OffsetDateTime.now(Zone
Offset.UTC),别依赖 Timestamp.valueOf(LocalDateTime)
spring.jackson.time-zone=UTC 和 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss,否则序列化可能悄悄加本地时区DateTimeFormatter 是不可变且线程安全的,创建开销略高但复用无风险;SimpleDateFormat 创建快,但并发下必须加锁或隔离,实际吞吐反而更低。
实操建议:
DateTimeFormatter 声明为 static final,例如:private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
SimpleDateFormat——哪怕只用一次,也比复用一个非线程安全实例更安全ThreadLocal 包一层,别图省事共享实例真正麻烦的不是语法,而是时区、leniency、JDBC 类型映射这三块的隐式行为。它们不会报错,但会在某个凌晨三点让数据差八小时。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...