首先,我们需要知道我们为什么要设置时区
这是因为Jackson在序列化Date类型时,默认会使用系统时区(中国是GMT+8)进行转换。
假设数据库中存储的时间是:2024-02-28 14:00:00
转换过程:
1. 从数据库读取:2024-02-28 14:00:00
2. Java中Date对象内部存储为时间戳(UTC)
3. Jackson序列化时,会将UTC时间转换为本地时区(GMT+8)
4. 结果:2024-02-28 06:00:00(比数据库时间少8小时)
下面是解决方案!!
在SpringBoot中有多种方式可以更改查询结果中的时间格式:
1. 使用 @JsonFormat 注解(推荐)
public class User {
// 格式化日期输出
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
// 或者 LocalDateTime
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}
2. 使用 @DateTimeFormat 注解(入参格式化)
public class User {
// 入参时间格式化
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthDay;
}
3. 全局配置(application.yml)(推荐)
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
url:jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
4. 配置类方式
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
return objectMapper;
}
}
5. 不同日期类型的处理
public class DateExample {
// java.util.Date
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date utilDate;
// java.sql.Date
@JsonFormat(pattern = "yyyy-MM-dd")
private java.sql.Date sqlDate;
// LocalDateTime
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;
// LocalDate
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate localDate;
// LocalTime
@JsonFormat(pattern = "HH:mm:ss")
private LocalTime localTime;
}
6. 常用日期格式
public class DatePatterns {
// 常用格式
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String DATE = "yyyy-MM-dd";
public static final String TIME = "HH:mm:ss";
public static final String YEAR_MONTH = "yyyy-MM";
public static final String CHINESE_DATE = "yyyy年MM月dd日";
public static final String CHINESE_DATE_TIME = "yyyy年MM月dd日 HH时mm分ss秒";
}
7. MyBatis中的日期格式处理
<!-- MyBatis映射文件中的日期格式化 -->
<select id="getUser" resultType="com.example.entity.User">
SELECT
id,
username,
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as createTime,
DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') as updateTime
FROM user
WHERE id = #{id}
</select>
注意事项
- 如果只需要格式化个别字段,使用@JsonFormat
- 如果需要全局配置,使用application.yml或配置类
- 如果需要自定义复杂的格式化逻辑,使用自定义序列化器
- 如果是处理前端传来的日期,使用@DateTimeFormat
希望对各位看官有所帮助,如果能得到您的一个赞,那就太荣幸了,下期见,谢谢~