• 通过js date对象获取各种开始结束日期的示例


    有时候做一些任务计划的功能时候,需要提供一个开始时间或者结束时间,比如本周结束,本月结束,今天结束等等,因此,我参考网上的资料把相关的实现为一个项目:

    执行测试用例,可以得到下面这种形式的结果:

    当前的时间: 2018-12-10 14:38:09
    昨天的开始日期: 2018-12-9 00:00:00
    昨天的结束日期: 2018-12-10 00:00:00
    今天的开始日期: 2018-12-10 00:00:00
    今天的结束日期: 2018-12-11 00:00:00
    明天的开始日期: 2018-12-11 00:00:00
    明天的结束日期: 2018-12-12 00:00:00
    上周的开始日期(星期一为一周开始): 2018-12-3 00:00:00
    上周的结束日期(星期一为一周开始): 2018-12-10 00:00:00
    本周的开始日期(星期一为一周开始): 2018-12-10 00:00:00
    本周的结束日期(星期一为一周开始): 2018-12-17 00:00:00
    下周的开始日期(星期一为一周开始): 2018-12-17 00:00:00
    下周的开始日期(星期一为一周开始): 2018-12-24 00:00:00
    上周的开始日期(星期日为一周开始): 2018-12-2 00:00:00
    上周的结束日期(星期日为一周开始): 2018-12-9 00:00:00
    本周的开始日期(星期日为一周开始): 2018-12-9 00:00:00
    本周的结束日期(星期日为一周开始): 2018-12-16 00:00:00
    下周的开始日期(星期日为一周开始): 2018-12-16 00:00:00
    下周的开始日期(星期日为一周开始): 2018-12-23 00:00:00
    上月的开始日期: 2018-11-1 00:00:00
    上月的结束日期: 2018-12-1 00:00:00
    本月的开始日期: 2018-12-1 00:00:00
    本月的结束日期: 2019-01-1 00:00:00
    下月的开始日期: 2019-01-1 00:00:00
    下月的结束日期: 2019-02-1 00:00:00
    去年的开始日期: 2017-01-1 00:00:00
    去年的结束日期: 2018-01-1 00:00:00
    今年的开始日期: 2018-01-1 00:00:00
    今年的结束日期: 2019-01-1 00:00:00
    明年的开始日期: 2019-01-1 00:00:00
    明年的结束日期: 2020-01-1 00:00:00
    

    源码:

    /**
     * 获取默认的日期格式化配置
     */
    function getDefaultDateFormatConfig() {
        var defaultFormatConfig = {
            /** 年月日的分隔符 */
            separator: "-",
            /** 是否显示毫秒 */
            showMillisecond: false,
            /** 是否填充0 */
            isFillZero: true,
        }
        return defaultFormatConfig;
    }
    
    /**
     * 填充 0 
     * @param {number} num 
     */
    function fillZero(num) {
        return (num > 10 ? "" : "0") + num;
    }
    /**
     * 简单的继承实现
     * @param {object} obj 继承的对象
     * @param {object} extendObj 被继承的对象
     */
    function extend(obj, extendObj) {
        for (key in extendObj) {
            if (extendObj.hasOwnProperty(key)) {
                obj[key] = extendObj[key];
            }
        }
        return obj;
    }
    
    /**
     * 格式化日期对象为字符串,如:1992-1-5 00:00:00
     * @param {Date} date 日期对象
     * @param {object} config 配置对象,支持参数参考defaultFormatConfig
     */
    function formatDate(date, config) {
        var defaultConfig = this.defaultConfig;
        var config = extend(defaultConfig, config);
    
        var separator = config.separator;
        var showMillisecond = config.showMillisecond;
        var isFillZero = config.isFillZero;
    
        var year = date.getFullYear();
        var month = (date.getMonth() + 1);
        var day = date.getDate();
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        var millisecond = date.getMilliseconds();
    
        if (isFillZero) {
            month = fillZero(month);
            date = fillZero(day);
            hour = fillZero(hour);
            minute = fillZero(minute);
            second = fillZero(second);
        }
    
        var formatStr = year + separator + month + separator + day + " " + hour + ":" + minute + ":" + second;
    
        if (showMillisecond) {
            formatStr += "." + millisecond;
        }
        return formatStr;
    }
    
    /**
     * 获取一个时分秒毫秒的值都是00的日期对象
     * @param {number} fullYear 年份 如 2018
     * @param {number} month 月 以0开始
     * @param {number} day 日
     */
    function getDateWithFillHMSSZero(fullYear, month, day) {
        var date = new Date();
        if (fullYear) {
            date.setFullYear(fullYear);
        }
        if (month) {
            date.setMonth(month);
        }
        if (day) {
            date.setDate(day);
        }
        date.setHours(0);
        date.setMinutes(0);
        date.setSeconds(0);
        date.setMilliseconds(0);
        return date;
    }
    
    module.exports = {
        formatDate: formatDate,
        defaultConfig: getDefaultDateFormatConfig(),
        /**
         * 获取当前的日期
         */
        getNowDate: function () {
            var date = new Date();
            return date;
        },
        /**
        * 获取昨天的开始日期
        */
        getYesterdayBegin: function () {
            var date = getDateWithFillHMSSZero();
            date.setDate(date.getDate() - 1);
            return date;
        },
        /**
         * 获取昨天的结束日期
         */
        getYesterdayEnd: function () {
            return this.getTodayBegin();
        },
        /**
         * 获取今天的开始日期
         */
        getTodayBegin: function () {
            var date = getDateWithFillHMSSZero();
            return date;
        },
        /**
         * 获取今天的结束日期
         */
        getTodayEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setDate(date.getDate() + 1);
            return date;
        },
        /**
        * 获取明天的开始日期
        */
        getTomorrowBegin: function () {
            return this.getTodayEnd();
        },
        /**
         * 获取明天的结束日期
         */
        getTomorrowEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setDate(date.getDate() + 2);
            return date;
        },
        /**
         * 获取上周的开始日期
         * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以本周星期日的 00:00:00 刻为开始日期
         */
        getLastWeekBegin: function (isStartByMonday) {
            if (isStartByMonday === undefined || isStartByMonday === null) {
                isStartByMonday = true;
            }
            var date = getDateWithFillHMSSZero();
            //现在通常的做法(也是国际惯例),是把星期日作为一周的开始,而星期六则是周末
            //这里的day表示天,星期用 dayOfWeek 表示
            var day = date.getDate();
            var dayOfWeek = date.getDay();//星期日的值是0
    
            var dayValue = 0;
            if (isStartByMonday) {
                //如果以星期一为开始,那么星期天应该是7
                if (dayOfWeek === 0) {
                    dayOfWeek = 7;
                }
                dayValue = day - dayOfWeek + 1 - 7;
            } else {
                dayValue = day - dayOfWeek - 7;
            }
            date.setDate(dayValue);
            return date;
        },
        /**
         * 获取上周的结束日期
         * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以下周星期日的 00:00:00 刻为开始日期
         */
        getLastWeekEnd: function (isStartByMonday) {
            return this.getThisWeekBegin(isStartByMonday);
        },
        /**
         * 获取本周的开始日期
         * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以本周星期日的 00:00:00 刻为开始日期
         */
        getThisWeekBegin: function (isStartByMonday) {
            if (isStartByMonday === undefined || isStartByMonday === null) {
                isStartByMonday = true;
            }
            var date = getDateWithFillHMSSZero();
            //现在通常的做法(也是国际惯例),是把星期日作为一周的开始,而星期六则是周末
            //这里的day表示天,星期用 dayOfWeek 表示
            var day = date.getDate();
            var dayOfWeek = date.getDay();//星期日的值是0
    
            var dayValue = 0;
            if (isStartByMonday) {
                //如果以星期一为开始,那么星期天应该是7
                if (dayOfWeek === 0) {
                    dayOfWeek = 7;
                }
                dayValue = day - dayOfWeek + 1;
            } else {
                dayValue = day - dayOfWeek;
            }
            date.setDate(dayValue);
            return date;
        },
        /**
         * 获取本周的结束日期
         * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以下周星期日的 00:00:00 刻为开始日期
         */
        getThisWeekEnd: function (isStartByMonday) {
            if (isStartByMonday === undefined || isStartByMonday === null) {
                isStartByMonday = true;
            }
            var date = getDateWithFillHMSSZero();
            //现在通常的做法(也是国际惯例),是把星期日作为一周的开始,而星期六则是周末
            //这里的day表示天,星期用 dayOfWeek 表示
            var day = date.getDate();
            var dayOfWeek = date.getDay();//星期日的值是0
            var dayValue = 0;
            if (isStartByMonday) {
                //如果以星期一为开始,那么星期天应该是7
                if (dayOfWeek === 0) {
                    dayOfWeek = 7;
                }
                dayValue = day + (7 - dayOfWeek) + 1;
            } else {
                dayValue = day + (7 - dayOfWeek);
            }
            date.setDate(dayValue);
            return date;
        },
        /**
         * 获取下周的开始日期
         * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以本周星期日的 00:00:00 刻为开始日期
         */
        getNextWeekBegin: function (isStartByMonday) {
            return this.getThisWeekEnd(isStartByMonday);
        },
        /**
         * 获取下周的结束日期
         * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻为开始日期,默认true,如果是false,则以下周星期日的 00:00:00 刻为开始日期
         */
        getNextWeekEnd: function (isStartByMonday) {
            if (isStartByMonday === undefined || isStartByMonday === null) {
                isStartByMonday = true;
            }
            var date = getDateWithFillHMSSZero();
            //现在通常的做法(也是国际惯例),是把星期日作为一周的开始,而星期六则是周末
            //这里的day表示天,星期用 dayOfWeek 表示
            var day = date.getDate();
            var dayOfWeek = date.getDay();//星期日的值是0
            var dayValue = 0;
            if (isStartByMonday) {
                //如果以星期一为开始,那么星期天应该是7
                if (dayOfWeek === 0) {
                    dayOfWeek = 7;
                }
                dayValue = day + (7 - dayOfWeek) + 1 + 7;
            } else {
                dayValue = day + (7 - dayOfWeek) + 7;
            }
            date.setDate(dayValue);
            return date;
        },
        /**
         * 获取上月的开始日期
         */
        getLastMonthBegin: function () {
            var date = getDateWithFillHMSSZero();
            date.setMonth(date.getMonth() - 1);
            date.setDate(1)//设置天为1
            return date;
        },
        /**
         * 获取上月的结束日期
         */
        getLastMonthEnd: function () {
            return this.getThisMonthBegin();
        },
        /**
     * 获取本月的开始日期
     */
        getThisMonthBegin: function () {
            var date = getDateWithFillHMSSZero();
            date.setDate(1)//设置天为1
            return date;
        },
        /**
         * 获取本月的结束日期
         */
        getThisMonthEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setMonth(date.getMonth() + 1);
            date.setDate(1)//设置天为1
            return date;
        },
        /**
         * 获取下月的开始日期
         */
        getNextMonthBegin: function () {
            return this.getThisMonthEnd();
        },
        /**
         * 获取下月的结束日期
         */
        getNextMonthEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setMonth(date.getMonth() + 2);
            date.setDate(1)//设置天为1
            return date;
        },
        /**
         * 获取去年的开始日期
         */
        getLastYearBegin: function () {
            var date = getDateWithFillHMSSZero();
            date.setFullYear(date.getFullYear() - 1);
            date.setMonth(0);//月是从0开始算
            date.setDate(1);
            return date;
        },
        /**
         * 获取去年的结束日期
         */
        getLastYearEnd: function () {
            return this.getThisYearBegin();
        },
        /**
         * 获取今年的开始日期
         */
        getThisYearBegin: function () {
            var date = getDateWithFillHMSSZero();
            date.setMonth(0);//月是从0开始算
            date.setDate(1);
            return date;
        },
        /**
         * 获取今年的结束日期
         */
        getThisYearEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setFullYear(date.getFullYear() + 1);
            date.setMonth(0);//月是从0开始算
            date.setDate(1);
            return date;
        },
        /**
         * 获取明年的开始日期
         */
        getNextYearBegin: function () {
            return this.getThisYearEnd();
        },
        /**
         * 获取明年的结束日期
         */
        getNextYearEnd: function () {
            var date = getDateWithFillHMSSZero();
            date.setFullYear(date.getFullYear() + 2);
            date.setMonth(0);//月是从0开始算
            date.setDate(1);
            return date;
        }
    }
    
    
    
  • 相关阅读:
    Ubuntu 12.04 安装scribe 的笔记 | 动漫驿站
    boost install on prinse 12.04 ubuntu
    basic coder » linux下获取当前程序的绝对路径
    spring 使用 groovy 的 utf8 问题
    string转化大小写(C++) | Vimer的程序世界
    linux常用命令一
    STL map与Boost unordered_map 有何不可的日志 网易博客
    本博使用的vim(gvim)相关插件整理
    【转】C++11中值得关注的几大变化 奔向C++ C++博客
    Lua 语言和C/C++集成调研小结
  • 原文地址:https://www.cnblogs.com/DHclly/p/10097013.html
Copyright © 2020-2023  润新知