日期工具类

/**
 * @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();
    }
};
posted @ 2019-04-09 16:02  苗士军  阅读(251)  评论(0)    收藏  举报