在现代Web开发中,时间处理是一个常见但容易出错的环节。无论是前端展示还是后端数据处理,时间格式的转换、时区的处理以及空值的判断都需要谨慎对待。本文将从前端(JavaScript/dayjs)和后端(Java)两个角度,详细介绍如何优雅地处理时间数据,解决诸如“2023-06-15T02:00:00.000+00:00 如何显示为 2023-06-15 10:00:00”等问题,并提供完整的代码示例和最佳实践。
java.time API(推荐)SimpleDateFormat(旧版兼容)在前端,我们通常需要将后端返回的 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 '-';
}
};默认情况下,dayjs 使用本地时区。如果需要强制转换为特定时区(如 UTC),可以使用插件:
npm install dayjs utc pluginimport 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');在 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 |
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"));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);
}在 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" 格式。@JsonFormat(timezone = "GMT+8"))。dayjs 自动转换时区。null 时前端显示异常。if (!timeStr) return '-'。if (graspingTime == null) return "-"。SimpleDateFormat 非线程安全。java.time API(推荐)。dayjs 替代 moment.js(更轻量)。java.time API(Java 8+)。@JsonFormat 定义时间格式和时区。后端数据库 (UTC)
→ 后端DTO (@JsonFormat)
→ 前端API (JSON)
→ dayjs 格式化
→ 页面渲染时间处理看似简单,但涉及时区、格式、空值等问题时容易出错。通过本文的解决方案,你可以:
dayjs 优雅地格式化时间。java.time 或 @JsonFormat 规范时间输出。希望这篇指南能帮助你彻底解决时间处理的难题! 🚀