# Vue Date Mixin 使用說明
## 概述
`vue-date-mixin.js` 是一個 Vue.js mixin,用於處理 ASP.NET ASMX Web Service 回傳的日期格式 `/Date(timestamp)/`。
## 功能
### 1. FormatDate(dateStr, separator)
將日期格式化為指定分隔符的格式。
**參數:**
- `dateStr`: 日期字串或 Date 物件
- `separator`: 日期分隔符,預設為 `"-"`
**回傳值:**
- 格式化後的日期字串
**範例:**
```javascript
this.FormatDate('/Date(1764622110737)/'); // 回傳: "2025-12-02" (使用預設 "-")
this.FormatDate('/Date(1764622110737)/', '/'); // 回傳: "2025/12/02"
this.FormatDate('/Date(1764622110737)/', '.'); // 回傳: "2025.12.02"
this.FormatDate(new Date(), '-'); // 回傳: "2025-01-15"
```
### 2. ConvertDatesInObject(obj, separator)
遍歷物件或陣列,自動轉換所有符合 ASP.NET ASMX 日期格式的屬性。
**參數:**
- `obj`: 要處理的物件或陣列
- `separator`: 日期分隔符,預設為 `"-"`
**回傳值:**
- 處理後的物件或陣列(所有日期欄位已轉換)
**範例:**
```javascript
// 使用預設分隔符 "-"
const item = {
編號: 1,
生效日期: '/Date(1764622110737)/',
備註: '測試'
};
const converted = this.ConvertDatesInObject(item);
// converted.生效日期 = "2025-12-02"
// 使用自訂分隔符 "/"
const converted2 = this.ConvertDatesInObject(item, '/');
// converted2.生效日期 = "2025/12/02"
// 處理陣列
const items = [
{ 編號: 1, 生效日期: '/Date(1764622110737)/' },
{ 編號: 2, 生效日期: '/Date(1764708510737)/' }
];
const converted = this.ConvertDatesInObject(items, '-');
// 所有項目的生效日期都會被轉換為 "YYYY-MM-DD" 格式
```
### 3. FormatDateTime(dateStr, separator)
將日期時間格式化為指定分隔符的格式。
**參數:**
- `dateStr`: 日期字串或 Date 物件
- `separator`: 日期分隔符,預設為 `"-"`
**回傳值:**
- 格式化後的日期時間字串
**範例:**
```javascript
this.FormatDateTime('/Date(1764622110737)/'); // 回傳: "2025-12-02 14:35:10"
this.FormatDateTime('/Date(1764622110737)/', '/'); // 回傳: "2025/12/02 14:35:10"
```
## 使用方式
### 1. 引入 Mixin
在 `.ascx.cs` 檔案中註冊腳本:
```csharp
Page.ClientScript.RegisterClientScriptInclude("DateMixin",
ParentPage.ResolveClientUrl("~/Scripts/vue-date-mixin.js"));
```
### 2. 在 Vue 實例中使用
```javascript
function CreateApp() {
app = new Vue({
el: "#APP",
mixins: [DateMixin], // 加入 mixin
data: {
Items: []
},
methods: {
SelectPage() {
axios.post('/Services/XXX.asmx/SelectPage', data)
.then(response => {
const result = response.data.d || response.data;
// 自動轉換所有日期欄位 (使用預設分隔符 "-")
const items = this.ConvertDatesInObject(result.data || []);
this.Items = items;
// 或使用自訂分隔符 "/"
// const items = this.ConvertDatesInObject(result.data || [], '/');
});
}
}
});
}
```
## 日期分隔符選項
### 常用分隔符
- `"-"` (預設): 2025-12-02
- `"/"`: 2025/12/02
- `"."`: 2025.12.02
- `""` (空字串): 20251202
### 使用建議
- **ISO 8601 標準**: 使用 `"-"` (例: 2025-12-02)
- **台灣慣用**: 使用 `"/"` (例: 2025/12/02)
- **歐洲慣用**: 使用 `"."` (例: 2025.12.02)
- **HTML5 date input**: 使用 `"-"` (必須是 YYYY-MM-DD 格式)
## 支援的日期格式
### 輸入格式
- ASP.NET ASMX 格式: `/Date(1764622110737)/`
- 標準 JavaScript Date 物件
- 任何可被 `new Date()` 解析的字串
### 輸出格式
- FormatDate: `YYYY{sep}MM{sep}DD` (例: 2025-12-02, 2025/12/02)
- FormatDateTime: `YYYY{sep}MM{sep}DD HH:mm:ss` (例: 2025-12-02 14:35:10)
## 注意事項
1. **預設分隔符**: 如果不提供 `separator` 參數,預設使用 `"-"`
2. **自動遞迴處理**: `ConvertDatesInObject` 會自動處理巢狀物件和陣列
3. **不改變原物件**: 方法會回傳新的物件,不會修改原始資料
4. **安全性**: 包含空值檢查和錯誤處理
5. **效能**: 只處理符合 `/Date(` 格式的字串,避免不必要的轉換
## 完整範例
```javascript
let app = null;
function CreateApp() {
app = new Vue({
el: "#APP",
mixins: [DateMixin],
data: {
Items: []
},
methods: {
LoadData() {
axios.post('/Services/MyService.asmx/GetData', {})
.then(response => {
const result = response.data.d;
if (result.success) {
// 使用預設分隔符 "-" (適用於 HTML5 date input)
this.Items = this.ConvertDatesInObject(result.data);
// 或使用 "/" 分隔符 (適用於顯示)
// this.Items = this.ConvertDatesInObject(result.data, '/');
}
});
},
FormatSingleDate() {
// 格式化單一日期
const dateStr = '/Date(1764622110737)/';
console.log(this.FormatDate(dateStr)); // "2025-12-02"
console.log(this.FormatDate(dateStr, '/')); // "2025/12/02"
}
}
});
}
```
## HTML5 Date Input 整合
當使用 HTML5 的 `` 時,**必須**使用 `"-"` 分隔符:
```html
```
```javascript
// 載入時使用 "-" 分隔符
this.Items = this.ConvertDatesInObject(result.data, '-');
// 或省略參數使用預設值 "-"
this.Items = this.ConvertDatesInObject(result.data);