目录
2. 框架场景:Spring Boot 接口返回(自动格式化)
方式 2:全局配置(所有 LocalDateTime 字段)
在使用 Java 的LocalDateTime
(java.time
包,Java 8 + 引入)时,其返回值(如通过toString()
方法)默认带有字母T
,这是ISO 8601 日期时间标准的规定,用于明确分隔 “日期部分” 和 “时间部分”(例如2024-05-20T14:30:00
)。
一、为什么会带 “T”?
LocalDateTime
的toString()
方法默认遵循ISO 8601-1:2019 标准,该标准规定:
日期和时间组合表示时,需用大写字母T
作为分隔符(例如yyyy-MM-dd'T'HH:mm:ss
),目的是避免歧义(例如区分202405201430
是 “2024 年 5 月 20 日 14:30” 还是其他解读)。
这是LocalDateTime
的默认行为,并非 “错误”,但实际开发中(如接口返回、页面展示)通常需要去掉T
,用更友好的格式(如2024-05-20 14:30:00
)。
二、如何去掉 “T” 或自定义格式?
核心是使用java.time.format.DateTimeFormatter
类,通过指定格式模板来转换LocalDateTime
为字符串,彻底控制输出格式。
1. 基础用法:手动格式化(通用场景)
步骤:
- 创建
LocalDateTime
实例(如当前时间、指定时间); - 定义
DateTimeFormatter
格式模板(按需调整); - 调用
LocalDateTime.format(Formatter)
方法生成目标字符串。
代码示例:
java
运行
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeDemo {
public static void main(String[] args) {
// 1. 获取当前LocalDateTime实例
LocalDateTime now = LocalDateTime.now();
System.out.println("默认格式(带T):" + now);
// 输出:默认格式(带T):2024-05-20T14:30:45.123456789
// 2. 定义格式化器:去掉T,格式为“yyyy-MM-dd HH:mm:ss”
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format1 = now.format(formatter1);
System.out.println("自定义格式(无T):" + format1);
// 输出:自定义格式(无T):2024-05-20 14:30:45
// 3. 其他常用格式示例
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
String format2 = now.format(formatter2);
System.out.println("中文格式:" + format2);
// 输出:中文格式:2024年05月20日 14时30分45秒
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); // 不带秒
String format3 = now.format(formatter3);
System.out.println("简化格式:" + format3);
// 输出:简化格式:2024/05/20 14:30
}
}
2. 框架场景:Spring Boot 接口返回(自动格式化)
如果LocalDateTime
作为接口返回值(如 JSON),默认仍会带T
(因 Jackson 默认序列化规则),需通过配置让 Jackson 自动格式化,无需手动调用format()
。
方式 1:局部配置(单个字段)
在实体类的LocalDateTime
字段上添加@JsonFormat
注解,指定格式:
java
运行
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
public class Order {
private Long id;
// 局部指定格式:接口返回时自动转为“yyyy-MM-dd HH:mm:ss”
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
// getter/setter
}
方式 2:全局配置(所有 LocalDateTime 字段)
在 Spring Boot 配置类中配置 Jackson,统一格式化所有LocalDateTime
:
java
运行
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.format.DateTimeFormatter;
@Configuration
public class JacksonConfig {
// 定义全局格式
private static final String GLOBAL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
// 配置LocalDateTime的序列化格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(GLOBAL_DATE_TIME_FORMAT);
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
};
}
}
三、注意事项
-
避免用
replace("T", " ")
:
虽然localDateTime.toString().replace("T", " ")
能临时去掉T
,但无法处理时间精度(如2024-05-20T14:30:45.123
会变成2024-05-20 14:30:45.123
,若需去掉毫秒则需额外处理),且不符合标准化编程习惯,推荐用DateTimeFormatter
。 -
格式模板的语法:
yyyy
:4 位年份(如 2024),yy
:2 位年份(如 24);MM
:2 位月份(如 05),M
:1 位月份(如 5);dd
:2 位日期(如 20),d
:1 位日期(如 20);HH
:24 小时制小时(如 14),hh
:12 小时制小时(如 02);mm
:分钟,ss
:秒,SSS
:毫秒。
通过以上方法,可彻底解决LocalDateTime
返回值带T
的问题,并灵活控制日期时间的展示格式。