前端与后端时间处理全攻略:从格式化到时区转换
个人名片
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?
- 专栏导航:
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀
前端与后端时间处理全攻略:从格式化到时区转换
引言
在现代Web开发中,时间处理是一个常见但容易出错的环节。无论是前端展示还是后端数据处理,时间格式的转换、时区的处理以及空值的判断都需要谨慎对待。本文将从前端(JavaScript/dayjs)和后端(Java)两个角度,详细介绍如何优雅地处理时间数据,解决诸如“2023-06-15T02:00:00.000+00:00 如何显示为 2023-06-15 10:00:00”等问题,并提供完整的代码示例和最佳实践。
目录
- 前端时间处理(JavaScript/dayjs)
- 时间格式化与空值处理
- 时区转换
- 表格中的时间渲染(Ant Design)
- 后端时间处理(Java)
java.timeAPI(推荐)SimpleDateFormat(旧版兼容)- Spring Boot 中的 JSON 序列化
- 常见问题与解决方案
- 时区不一致问题
- 空值处理
- 线程安全问题
- 总结与最佳实践
1. 前端时间处理(JavaScript/dayjs)
1.1 时间格式化与空值处理
在前端,我们通常需要将后端返回的 UTC 时间(如 2023-06-15T02:00:00.000+00:00)转换为本地时间并格式化。推荐使用 dayjs 库(轻量级,API 友好)。
基本格式化函数
import dayjs from 'dayjs';
const formatDateTime = (timeStr) => {
if (!timeStr) return '-'; // 空值返回占位符
return dayjs(timeStr).format('YYYY-MM-DD HH:mm:ss');
};
说明:
dayjs(timeStr)自动解析 ISO 8601 格式时间。format()方法指定输出格式(YYYY-MM-DD HH:mm:ss)。- 空值返回
'-',避免显示null或undefined。
增强版(带错误处理)
const formatDateTime = (timeStr) => {
if (!timeStr || timeStr === 'null' || timeStr === 'undefined') return '-';
try {
const date = dayjs(timeStr);
return date.isValid() ? date.format('YYYY-MM-DD HH:mm:ss') : '-';
} catch (e) {
console.error('时间格式化失败:', e);
return '-';
}
};
1.2 时区转换
默认情况下,dayjs 使用本地时区。如果需要强制转换为特定时区(如 UTC),可以使用插件:
npm install dayjs utc plugin
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
// 转换为北京时间
const beijingTime = dayjs.utc(timeStr).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
1.3 在 Ant Design 表格中渲染时间
在 Ant Design 的 Table 组件中,可以通过 customRender 或 render 列配置实现时间格式化:
const columns = [
{
title: '抓取时间',
dataIndex: 'graspingTime',
key: 'graspingTime',
render: (text) => formatDateTime(text), // 直接调用格式化函数
},
];
效果:
| 原始数据 | 格式化结果 |
|---|---|
null | - |
2023-06-15T02:00:00.000+00:00 | 2023-06-15 10:00:00 |
2. 后端时间处理(Java)
2.1 使用 java.time API(Java 8+ 推荐)
Java 8 引入了 java.time 包,提供了更直观的日期时间操作方式。
核心代码
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public String formatGraspingTime(Date graspingTime) {
if (graspingTime == null) {
return "-";
}
// 转换为系统默认时区
ZonedDateTime zonedDateTime = graspingTime.toInstant()
.atZone(ZoneId.systemDefault());
// 格式化
return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
说明:
toInstant()将Date转换为 UTC 时间。atZone()转换为本地时区时间。DateTimeFormatter定义输出格式。
指定时区(如北京时间)
ZonedDateTime zonedDateTime = graspingTime.toInstant()
.atZone(ZoneId.of("Asia/Shanghai"));
2.2 使用 SimpleDateFormat(兼容旧版 Java)
如果项目仍在使用旧版 Java,可以用 SimpleDateFormat,但需注意线程安全问题。
public String formatGraspingTime(Date graspingTime) {
if (graspingTime == null) {
return "-";
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置时区
return sdf.format(graspingTime);
}
2.3 Spring Boot 中的 JSON 序列化
在 Spring Boot 中,可以通过 @JsonFormat 注解直接在 DTO 中定义时间格式:
public class MyEntityDTO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date graspingTime;
// Getter/Setter
}
效果:
- 序列化时自动转换为
"2023-06-15 10:00:00"格式。 - 时区设置为东八区(北京时间)。
3. 常见问题与解决方案
3.1 时区不一致问题
- 问题:前端显示时间比数据库少 8 小时。
- 原因:后端返回 UTC 时间,前端未转换时区。
- 解决:
- 后端:返回带时区的时间字段(如
@JsonFormat(timezone = "GMT+8"))。 - 前端:使用
dayjs自动转换时区。
- 后端:返回带时区的时间字段(如
3.2 空值处理
- 问题:时间字段为
null时前端显示异常。 - 解决:
- 前端:
if (!timeStr) return '-'。 - 后端:
if (graspingTime == null) return "-"。
- 前端:
3.3 线程安全问题
- 问题:
SimpleDateFormat非线程安全。 - 解决:
- 每次调用时新建实例。
- 改用
java.timeAPI(推荐)。
4. 总结与最佳实践
前端最佳实践
- 使用
dayjs替代moment.js(更轻量)。 - 所有时间渲染前必须格式化并处理空值。
- 时区转换尽量在前端统一处理。
后端最佳实践
- 优先使用
java.timeAPI(Java 8+)。 - 在 DTO 中用
@JsonFormat定义时间格式和时区。 - 数据库存储 UTC 时间,业务逻辑按需转换时区。
完整流程图
后端数据库 (UTC)
→ 后端DTO (@JsonFormat)
→ 前端API (JSON)
→ dayjs 格式化
→ 页面渲染
结语
时间处理看似简单,但涉及时区、格式、空值等问题时容易出错。通过本文的解决方案,你可以:
- 在前端使用
dayjs优雅地格式化时间。 - 在后端用
java.time或@JsonFormat规范时间输出。 - 避免时区不一致、空值异常等常见问题。
希望这篇指南能帮助你彻底解决时间处理的难题! 🚀


浙公网安备 33010602011771号