企业级项目日期时间规范的核心是统一、可维护、线程安全、时区明确,必须使用Java 8的java.time API;全局常量与格式器集中管理,按场景严格区分Instant、LocalDateTime、ZonedDateTime用途;通过Spring Converter、Jackson模块、MyBatis TypeHandler实现自动解析与格式化;强制严格模式校验并禁用旧API。

企业级项目中,日期时间规范的核心是统一、可维护、线程安全、时区明确。Java 8 的 java.time API 是唯一推荐的技术选型,旧的 Date 和 SimpleDateFormat 已不适用于现代工程实践。
定义全局日期时间常量与格式器
在项目根包下(如 com.example.common.constant)建立统一常量类,集中管理所有标准格式:
-
固定格式字符串:如
YYYY_MM_DD = "yyyy-MM-dd"、YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss",避免散落在各处的硬编码 -
线程安全的格式器实例:用
static final DateTimeFormatter声明,例如:public static final DateTimeFormatter STANDARD_DATETIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); -
优先使用预定义格式器:如
DateTimeFormatter.ISO_LOCAL_DATE_TIME,语义清晰且经严格测试
分场景约束数据类型与用途
不同业务含义的时间应强制使用对应类型,杜绝用 LocalDateTime 存储 UTC 时间或用 Instant 表示本地显示时间:
-
系统内部存储/计算:一律使用
Instant,它代表时间轴上的精确点,无歧义、无时区、适合数据库TIMESTAMP WITH TIME ZONE字段 -
前端展示/用户输入:用
LocalDateTime(仅限同地多用户场景)或ZonedDateTime(需跨时区支持),配合ZoneId.systemDefault()或用户配置时区解析 -
日志与审计时间戳:统一调用
Instant.now(),不依赖系统本地时钟偏差
统一入参解析与出参格式化机制
避免每个 Controller 手动 parse/format,通过 Spring 的 @InitBinder 或全局 Converter 实现自动转换:
立即学习“Java免费学习笔记(深入)”;
- 注册自定义
Converter<String, LocalDateTime>,对所有@RequestParam和@PathVariable中的日期字符串按标准格式解析 - 为
@RequestBody配置Jackson的JavaTimeModule,设置默认序列化格式:mapper.registerModule(new JavaTimeModule().addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(StandardFormatters.STANDARD_DATETIME))); - 数据库层(如 MyBatis)通过 TypeHandler 统一处理
Instant ↔ TIMESTAMP映射,屏蔽 JDBC 驱动差异
强制校验与异常防护
格式不匹配必须在早期暴露,而非运行时崩溃:
- 所有
parse()操作禁用ResolverStyle.LENIENT,坚持严格模式 - 接收外部输入(如 API 请求体)时,用
@DateTimeFormat(pattern = "yyyy-MM-dd")注解配合 Bean Validation,失败直接返回 400 - 在 CI 流程中加入静态检查规则,禁止出现
new SimpleDateFormat(...)、Date构造方法、Calendar.getInstance()等旧 API 调用


















