在前端Vue3项目中,格式化后端返回的java.util.Date
类型时间到yyyy-MM-dd HH:mm:ss
格式,有几种常用方法:
方法一:使用JavaScript内置方法
<JAVASCRIPT>
// 假设后端返回的数据结构为 { createTime: '2023-05-15T08:30:00.000+00:00' }function formatDate(date) {const d = new Date(date);const year = d.getFullYear();const month = String(d.getMonth() + 1).padStart(2, '0');const day = String(d.getDate()).padStart(2, '0');const hours = String(d.getHours()).padStart(2, '0');const minutes = String(d.getMinutes()).padStart(2, '0');const seconds = String(d.getSeconds()).padStart(2, '0');return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}// 使用示例
const formattedDate = formatDate(backendData.createTime);
方法二:使用day.js(推荐)
1. 首先安装day.js
<BASH>
npm install dayjs
2. 创建实用函数
<JAVASCRIPT>
// utils/dateUtils.js
import dayjs from 'dayjs';export function formatDateTime(date) {return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
}
3. 在组件中使用
<VUE>
<template><div><p>创建时间: {{ formatDateTime(item.createTime) }}</p></div>
</template><script setup>
import { formatDateTime } from '@/utils/dateUtils';const item = {createTime: '2023-05-15T08:30:00.000+00:00' // 假设这是后端返回的数据
};
</script>
方法三:使用Vue filter(虽然Vue3中不太推荐,但兼容Vue2)
<JAVASCRIPT>
// main.js
import { createApp } from 'vue';
import dayjs from 'dayjs';const app = createApp(App);app.config.globalProperties.$filters = {formatDate(date) {return dayjs(date).format('YYYY-MM-DD HH:mm:ss');}
};app.mount('#app');
在模板中使用:
<VUE>
<template><span>{{ $filters.formatDate(item.createTime) }}</span>
</template>
方法四:使用自定义hook(Composition API方式)
<JAVASCRIPT>
// hooks/useDateFormat.js
import { computed } from 'vue';
import dayjs from 'dayjs';export function useDateFormat() {const formatDate = (date) => {return computed(() => dayjs(date).format('YYYY-MM-DD HH:mm:ss')).value;};return { formatDate };
}
在组件中使用:
<VUE>
<script setup>
import { useDateFormat } from '@/hooks/useDateFormat';const { formatDate } = useDateFormat();const backendData = {createTime: '2023-05-15T08:30:00.000+00:00'
};
</script><template><p>格式化后的时间: {{ formatDate(backendData.createTime) }}</p>
</template>
处理时区问题
如果后端返回的时间字符串包含时区信息(如2023-05-15T08:30:00.000+00:00
),需要特别注意时区转换:
<JAVASCRIPT>
// 使用dayjs处理时区
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';dayjs.extend(utc);
dayjs.extend(timezone);function formatDateWithTimezone(date) {return dayjs.utc(date).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
}
最佳实践建议
- 推荐使用day.js - 它轻量且功能强大,相比moment.js体积更小
- 封装为工具函数 - 将日期格式化逻辑封装,便于统一管理和修改
- 在接口层处理 - 可以在axios响应拦截器中统一格式化日期字段
- 考虑时区 - 确保前端显示的时区与用户期望的一致(通常是本地时区或东八区)
响应拦截器统一处理示例
<JAVASCRIPT>
// src/utils/request.js
import dayjs from 'dayjs';const service = axios.create({// ...其他配置
});service.interceptors.response.use(response => {if (response.data && response.data.data) {formatDates(response.data.data);}return response;
});function formatDates(obj) {if (!obj || typeof obj !== 'object') return;Object.keys(obj).forEach(key => {// 假设所有包含"time"或"date"的字段都是日期字段if (/time|date|Time|Date/.test(key) && obj[key]) {obj[key] = dayjs(obj[key]).format('YYYY-MM-DD HH:mm:ss');}});
}
这样处理后,所有接口返回的日期字段会自动格式化为指定格式,无需在每个组件中单独处理。