Java 8+Hibernate 5+MySQL时间存储与格式转换问题咨询
你的Hibernate + MySQL时间相关问题解答
咱们一个个拆解你的问题,都是日常开发里常见的时区与时间存储坑:
1. 怎么查看时间的AM/PM,以及确认数据库时间格式
MySQL的DATETIME/TIMESTAMP类型默认是24小时制存储和显示的,你看到的06:26:47.336就是早上6点(属于AM),如果是下午6点会直接显示成18:26:47.336。
要是想明确输出AM/PM标识,可以用MySQL的DATE_FORMAT函数格式化查询结果:
SELECT DATE_FORMAT(user_created, '%Y-%m-%d %h:%i:%s.%f %p') FROM your_user_table;
这里%h对应12小时制的小时数,%p会自动输出AM或PM。
2. 如何以24小时制格式存储时间
其实MySQL存储时间时并不区分12/24小时制——它存的是时间的实际时间戳值,显示格式只是输出层面的表现。要确保存储的时间逻辑正确,你只需要:
- 插入时间时用正确的24小时制值(比如下午3点要写
15:00而不是03:00) - 字段类型选
DATETIME或TIMESTAMP(推荐TIMESTAMP如果需要时区自动转换,DATETIME也能满足基础需求) - Hibernate用
LocalDateTime映射是没问题的,只要时区配置正确,插入的时间会被正确解析存储。
3. 确认是否配置为接收UTC时间
你查询SELECT @@global.time_zone;得到+00:00,说明数据库的全局时区是UTC,这意味着数据库默认会以UTC来处理时间。不过要注意,会话时区可能和全局时区不一致,建议再查一下会话时区:
SELECT @@session.time_zone;
如果会话时区也是+00:00,那你的数据库确实是配置为接收和存储UTC时间的。
4. POJO用LocalDateTime但查询结果与数据库时间不一致的问题
你看到u1.getUserCreated(): 2018-03-11T01:26:47.336,而数据库里是2018-03-11 06:26:47.336,这明显是时区转换偏差:数据库存的是UTC时间,而你的应用程序所在时区是UTC-5(比如美国东部时间),Hibernate读取时自动转成了应用时区的时间。
解决方法:
- 在Hibernate配置中指定JDBC时区为UTC,让Hibernate用UTC处理数据库与POJO的时间转换:
若是Spring项目,直接在hibernate.jdbc.time_zone=UTCapplication.properties里加:spring.jpa.properties.hibernate.jdbc.time_zone=UTC - 如果需要明确时区信息,也可以把POJO字段类型从
LocalDateTime改成ZonedDateTime或OffsetDateTime,直接携带时区信息避免歧义。
内容的提问来源于stack exchange,提问作者Noman
相关产品推荐
相关产品推荐

