128 lines
4.9 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
};
|