Files
thinkyu/教育訓練系統/Web/Scripts/vue-date-mixin.js
T
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

128 lines
4.9 KiB
JavaScript

// Vue Mixin - 日期轉換工具
// 用於處理 ASP.NET ASMX Web Service 回傳的日期格式
var DateMixin = {
methods: {
/**
* 格式化日期
* @param {string|Date} dateStr - 日期字串或 Date 物件
* @param {string} separator - 日期分隔符,預設為 "-"
* @returns {string} 格式化後的日期字串
*/
FormatDate: function(dateStr, separator) {
if (!dateStr) return '';
// 預設分隔符為 "-"
if (separator === undefined) {
separator = '-';
}
// 處理 ASP.NET ASMX 的日期格式 /Date(1764622110737)/
if (typeof dateStr === 'string' && dateStr.indexOf('/Date(') === 0) {
var timestamp = parseInt(dateStr.match(/-?\d+/)[0]);
var date = new Date(timestamp);
var year = String(date.getFullYear()).padStart(4, '0');
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
return year + separator + month + separator + day;
}
// 如果已經是一般的 Date 物件或其他格式
var date = new Date(dateStr);
if (!isNaN(date.getTime())) {
var year = String(date.getFullYear()).padStart(4, '0');
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
return year + separator + month + separator + day;
}
return dateStr;
},
/**
* 遍歷物件或陣列,自動轉換所有符合 ASP.NET ASMX 日期格式的屬性
* @param {Object|Array} obj - 要處理的物件或陣列
* @param {string} separator - 日期分隔符,預設為 "-"
* @returns {Object|Array} 處理後的物件或陣列
*/
ConvertDatesInObject: function(obj, separator) {
if (!obj) return obj;
// 預設分隔符為 "-"
if (separator === undefined) {
separator = '-';
}
// 處理陣列
if (Array.isArray(obj)) {
return obj.map(function(item) {
return this.ConvertDatesInObject(item, separator);
}.bind(this));
}
// 處理物件
if (typeof obj === 'object') {
var result = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var value = obj[key];
// 檢查是否為 ASP.NET ASMX 日期格式
if (typeof value === 'string' && value.indexOf('/Date(') === 0) {
result[key] = this.FormatDate(value, separator);
}
// 遞迴處理巢狀物件或陣列
else if (value !== null && typeof value === 'object') {
result[key] = this.ConvertDatesInObject(value, separator);
}
else {
result[key] = value;
}
}
}
return result;
}
return obj;
},
/**
* 格式化日期時間
* @param {string|Date} dateStr - 日期字串或 Date 物件
* @param {string} separator - 日期分隔符,預設為 "-"
* @returns {string} 格式化後的日期時間字串
*/
FormatDateTime: function(dateStr, separator) {
if (!dateStr) return '';
// 預設分隔符為 "-"
if (separator === undefined) {
separator = '-';
}
var date;
// 處理 ASP.NET ASMX 的日期格式 /Date(1764622110737)/
if (typeof dateStr === 'string' && dateStr.indexOf('/Date(') === 0) {
var timestamp = parseInt(dateStr.match(/-?\d+/)[0]);
date = new Date(timestamp);
} else {
date = new Date(dateStr);
}
if (isNaN(date.getTime())) {
return dateStr;
}
var year = String(date.getFullYear()).padStart(4, '0');
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
var hours = String(date.getHours()).padStart(2, '0');
var minutes = String(date.getMinutes()).padStart(2, '0');
var seconds = String(date.getSeconds()).padStart(2, '0');
return year + separator + month + separator + day + ' ' + hours + ':' + minutes + ':' + seconds;
}
}
};