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

2023-11-10

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

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

当前的时间: 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;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过js date对象获取各种开始结束日期的示例 的相关文章

  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • Angular - CSS - 自定义类型=文件输入,如何使用按钮而不是标签?

    我制作了一个类型为 file 的自定义输入字段 因为我不喜欢默认的输入字段 为了实现这一目标 我做了
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐

  • [转自:QQ首页 > 腾讯科技 > 人物 > 正文]金蝶中间件袁红岗:JavaEE5.0是另一震撼

    被业界称为 中国Java第一人 的金蝶中间件首席科学家袁红岗认为 Java EE 5 0 来得并不晚 可能是J2EE诞生以来比较重量级的一次震撼 在中国Java技术界 袁红岗是一个不能忽视的名字 他的观点 及对中间件趋势的看法 是很多人感兴
  • 解决CMake Error: The source directory "*" does not appear to contain CMakeLists.txt.

    Hi 大家好 我是钟义林 昨儿个安装mysql 遇到了几个问题 现在打算把问题的解决方法写出来 和大家分享一下 这次我就不截图了 下面大家一起看一下 问题 一 CMake Error The source directory opt mys
  • 开源项目SMSS发开指南(四)——SSL/TLS加密通信详解

    本文将详细介绍如何在Java端 C 端和NodeJs端实现基于SSL TLS的加密通信 重点分析Java端利用SocketChannel和SSLEngine从握手到数据发送 接收的完整过程 本文也涵盖了在Ubuntu系统上利用OpenSSL
  • springBoot的序列化与反序列化

    springboot中的序列化与反序列化有一个相对比较复杂的转换过程 它主要是HTTP请求 响应的信息类型转换 包含编码 信息类型 信息转换器 注解方法的处理适配器 请求接收的信息处理器等等 我们就先从大家常用的RequestBody和Re
  • java知识结构

    基础 1 java概述 2 搭建运行环境 3 java基本语法 常变量 数据类型 运算符 标识符与关键字 4 流程控制 5 eclipse开发工具 6 面向对象编程 类和对象 包 继承 this super关键字 多态 重载 重写 抽象类f
  • systemverilog中的bind

    最早接触 bind 关键字是在assertion 当中 将assertion 与 dut 进行绑定连接 如下例子 bind cpu fpu props fpu rules 1 a b c cpu 是module 名字 fpu props 是
  • ElementUI表格的动态渲染

    在ElementUI官方文档中 描述的动态渲染只是单纯的将已知字段名称的JSON数据通过prop属性填充到页面中 下为官方文档内容
  • 轮播图背景图铺满整个div

    slider width 1224px height 458px background image url image school 1 png background size cover background repeat round p
  • Biogeochemical record of ancient humans (古人类生物地理化学记录)

    一 摘要 该文为一篇综述 全文主要介绍了如何利用生物化学记录 同位素 研究古人类饮食 营养和活动 二 作者简介 Marilyn Fogel born September 19 1952 is an American geo ecologis
  • Java程序中对Service进行Mock

    Java程序中对Service进行Mock 背景 Servie Test Service 背景 在项目中往往需要对service逻辑进行单元测试验证 这里采用mockito对dao数据进行模拟 验证service逻辑 Servie pack
  • 算法训练 大小写转换

    http lx lanqiao org problem page gpid T216 算法训练 大小写转换 时间限制 1 0s 内存限制 512 0MB 问题描述 编写一个程序 输入一个字符串 长度不超过20 然后把这个字符串内的每一个字符
  • 快速获得CNVD证书

    首先要明确什么样的通用漏洞可以发证书 收录标准 这里的收录标准是能获得证书的标准 事件型 事件型漏洞必须是三大运营商 移动 联通 电信 的中高危漏洞 或者党政机关 重要行业单位 科研院所 重要企事业单位 如 中央国有大型企业 部委直属事业单
  • maven子工程application文件失效

    按照如下进行操作
  • ubuntu下载goalng-1.9

    一 安装 这里以安装golang1 9为例 1 首先通过命令行直接安装 sudo apt get install golang 1 9 2 下载好之后 查看go的版本 catik catik Aspire V3 471 go version
  • 2023杭电暑假多校6 题解 1 2 6 10

    文章目录 1 Count 2 Pair Sum and Perfect Square https vjudge csgrandeur cn problem HDU 7337 6 Perfect square number https vju
  • C++中的拷贝构造函数

    1 拷贝构造函数 拷贝构造函数是一种特殊的构造函数 它在创建对象时 是使用同一类中之前创建的对象来初始化新创建的对象 拷贝构造函数通常用于 a 当用类的一个对象去初始化该类的另一个对象 或引用 时系统自动调用拷贝构造函数实现拷贝赋值 b 若
  • 微信小程序开发(二)微信小程序的调试和发布

    调试 编译和预览 预览 点击预览 可以使用微信扫描二维码 在手机上安装测试版小程序 或者点击自动预览 可以连接手机微信或者直接在电脑端打开小程序预览 发布 上传代码 发布项目 工具 上传 确定 编辑版本号和描述 点击上传 上传成功 点击下载
  • mysql错误代码1045的原因及解决方案、Mysql服务没找到?

    mysql错误代码1045的原因及解决方案 Mysql服务没找到 再一次接触数据库时 想要用工具连接数据库的时候 出现了错误 Acess denied for localhost 忘了 应该是服务器的问题 就去重启了一下服务器 net st
  • 【Ant Design of Vue】Tree 树形控件双击树节点禁止取消选中(两种方法)

    一 需求 Ant Design of Vue官网中 第一次点击树节点会选中 再一次点击该树节点会取消选中 如图所示 现有如下需求 根据左侧选中树节点 去请求接口获取右侧表格数据 第一次点击树节点则选中 再一次点击该树节点不会取消选中 不会取
  • 通过js date对象获取各种开始结束日期的示例

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