日期工具类
/**
* @author: 苗士军
* @description 日期工具类
*/
const DateUtils = {
/**
* 日期格式化模式
*/
patterns: {
PATTERN_ERA: 'G', // Era 标志符
PATTERN_YEAR: 'y', // 年
PATTERN_MONTH: 'M', // 月份
PATTERN_DAY_OF_MONTH: 'd', // 月份的天数
PATTERN_HOUR_OF_DAY1: 'k', // 一天中的小时数(1-24)
PATTERN_HOUR_OF_DAY0: 'H', // 24小时制,一天中的小时数(0-23)
PATTERN_MINUTE: 'm', // 小时中的分钟数
PATTERN_SECOND: 's', // 秒
PATTERN_MILLISECOND: 'S', // 毫秒
PATTERN_DAY_OF_WEEK: 'E', // 一周中对应的星期
PATTERN_DAY_OF_YEAR: 'D', // 一年中的第几天
PATTERN_WEEK_OF_YEAR: 'w', // 一年中的第几个星期
PATTERN_WEEK_OF_MONTH: 'W', // 一月中的第几星期
PATTERN_AM_PM: 'a', // 上下午标识
PATTERN_HOUR1: 'h', // 12小时制,am/pm 中的小时数(1-12)
PATTERN_HOUR0: 'K', // 12小时制,am/pm 中的小时数(0-11)
PATTERN_ZONE_NAME: 'z', // 时区名
PATTERN_ZONE_VALUE: 'Z' // 时区值
},
/**
* 星期表示
*/
week: {
'ch': {
"0": "日",
"1": "一",
"2": "二",
"3": "三",
"4": "四",
"5": "五",
"6": "六"
},
'en': {
"0": "Sunday",
"1": "Monday",
"2": "Tuesday",
"3": "Wednesday",
"4": "Thursday",
"5": "Friday",
"6": "Saturday"
}
},
/**
* @description 获取当前时间
* @return {string} 格式化的当前时间
*/
getCurrentTime: function() {
var today = new Date();
var year = today.getFullYear();
var month = today.getMonth() + 1;
var day = today.getDate();
var hours = today.getHours();
var minutes = today.getMinutes();
var seconds = today.getSeconds();
// 补零处理
var pad = function(num) {
return String(num).padStart(2, '0');
};
var timeString = year + "-" + pad(month) + "-" + pad(day) + " " +
pad(hours) + ":" + pad(minutes) + ":" + pad(seconds);
return timeString;
},
/**
* @description 比较时间大小
* @param {string} time1 时间字符串
* @param {string} time2 时间字符串
* @return {number} time1>time2 return 1, time1<time2 return -1, time1==time2 return 0
*/
compareTime: function(time1, time2) {
if (!time1 || !time2) {
throw new Error('Time parameters are required');
}
var date1 = new Date(time1.replace(/-/g, "/"));
var date2 = new Date(time2.replace(/-/g, "/"));
if (isNaN(date1.getTime()) || isNaN(date2.getTime())) {
throw new Error('Invalid date format');
}
if (date1 > date2) {
return 1;
} else if (date1 < date2) {
return -1;
} else {
return 0;
}
},
/**
* @description 是否闰年
* @param {number} year 年份
* @return {boolean} 是否为闰年
*/
isLeapYear: function(year) {
if (typeof year !== 'number') {
throw new Error('Year must be a number');
}
return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);
},
/**
* @description 获取某个月的天数(月份从0开始)
* @param {number} year 年份
* @param {number} month 月份(0-11)
* @return {number} 月份的天数
*/
getDaysOfMonth: function(year, month) {
if (typeof year !== 'number' || typeof month !== 'number') {
throw new Error('Year and month must be numbers');
}
if (month < 0 || month > 11) {
throw new Error('Month must be between 0 and 11');
}
return [31, (this.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
},
/**
* @description 获取某个月的天数(月份从1开始)
* @param {number} year 年份
* @param {number} month 月份(1-12)
* @return {number} 月份的天数
*/
getDaysOfMonth2: function(year, month) {
if (typeof year !== 'number' || typeof month !== 'number') {
throw new Error('Year and month must be numbers');
}
if (month < 1 || month > 12) {
throw new Error('Month must be between 1 and 12');
}
// 将天置为0,会获取其上个月的最后一天
var date = new Date(year, month, 0);
return date.getDate();
},
/**
* @description 距离现在几天的日期
* @param {number} days 天数(负数表示今天之前的日期,0表示今天,整数表示未来的日期)
* @return {string} 格式化的日期
*/
fromToday: function(days) {
if (typeof days !== 'number') {
throw new Error('Days must be a number');
}
var today = new Date();
today.setDate(today.getDate() + days);
var year = today.getFullYear();
var month = today.getMonth() + 1;
var day = today.getDate();
// 补零处理
var pad = function(num) {
return String(num).padStart(2, '0');
};
var date = year + "-" + pad(month) + "-" + pad(day);
return date;
},
/**
* @description 日期时间格式化
* @param {Date|string|number} dateTime 需要格式化的日期时间
* @param {String} pattern 格式化的模式
* @return {string} 格式化后的日期字符串
*/
format: function(dateTime, pattern) {
var date = new Date(dateTime);
if (isNaN(date.getTime())) {
throw new Error('Invalid date');
}
if (!pattern) {
return date.toLocaleString();
}
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours24 = date.getHours();
var hours12 = hours24 % 12 || 12;
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var milliseconds = date.getMilliseconds();
var dayOfWeek = date.getDay();
var dayOfYear = Math.floor((date - new Date(year, 0, 0)) / 86400000);
var weekOfYear = Math.ceil((dayOfYear + new Date(year, 0, 1).getDay()) / 7);
var ampm = hours24 >= 12 ? 'PM' : 'AM';
// 补零函数
var pad = function(num, length) {
return String(num).padStart(length, '0');
};
return pattern.replace(/([a-z])\1*/ig, function(match) {
switch (match) {
case 'yyyy':
return year;
case 'yy':
return String(year).substring(2);
case 'MM':
return pad(month, 2);
case 'M':
return month;
case 'dd':
return pad(day, 2);
case 'd':
return day;
case 'HH':
return pad(hours24, 2);
case 'H':
return hours24;
case 'hh':
return pad(hours12, 2);
case 'h':
return hours12;
case 'mm':
return pad(minutes, 2);
case 'm':
return minutes;
case 'ss':
return pad(seconds, 2);
case 's':
return seconds;
case 'SSS':
return pad(milliseconds, 3);
case 'S':
return milliseconds;
case 'E':
return DateUtils.week.ch[dayOfWeek];
case 'EEEE':
return '星期' + DateUtils.week.ch[dayOfWeek];
case 'a':
return ampm;
case 'D':
return dayOfYear;
case 'w':
return weekOfYear;
default:
return match;
}
});
},
/**
* @description 解析日期字符串
* @param {string} dateString 日期字符串
* @return {Date} 日期对象
*/
parse: function(dateString) {
if (!dateString) {
throw new Error('Date string is required');
}
var date = new Date(dateString.replace(/-/g, "/"));
if (isNaN(date.getTime())) {
throw new Error('Invalid date format');
}
return date;
},
/**
* @description 添加天数
* @param {Date|string|number} date 日期
* @param {number} days 天数
* @return {Date} 新的日期对象
*/
addDays: function(date, days) {
if (!date || typeof days !== 'number') {
throw new Error('Date and days are required');
}
var newDate = new Date(date);
newDate.setDate(newDate.getDate() + days);
return newDate;
},
/**
* @description 添加月份
* @param {Date|string|number} date 日期
* @param {number} months 月份数
* @return {Date} 新的日期对象
*/
addMonths: function(date, months) {
if (!date || typeof months !== 'number') {
throw new Error('Date and months are required');
}
var newDate = new Date(date);
newDate.setMonth(newDate.getMonth() + months);
return newDate;
},
/**
* @description 添加年份
* @param {Date|string|number} date 日期
* @param {number} years 年数
* @return {Date} 新的日期对象
*/
addYears: function(date, years) {
if (!date || typeof years !== 'number') {
throw new Error('Date and years are required');
}
var newDate = new Date(date);
newDate.setFullYear(newDate.getFullYear() + years);
return newDate;
},
/**
* @description 判断是否为同一天
* @param {Date|string|number} date1 日期1
* @param {Date|string|number} date2 日期2
* @return {boolean} 是否为同一天
*/
isSameDay: function(date1, date2) {
if (!date1 || !date2) {
throw new Error('Date parameters are required');
}
var d1 = new Date(date1);
var d2 = new Date(date2);
return d1.getFullYear() === d2.getFullYear() &&
d1.getMonth() === d2.getMonth() &&
d1.getDate() === d2.getDate();
}
};

浙公网安备 33010602011771号