在前端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');}});
}
這樣處理后,所有接口返回的日期字段會自動格式化為指定格式,無需在每個組件中單獨處理。