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

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

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

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

  1. js Date对象总结

    Date在js中和Array类似,都是拥有自己的特殊方法的特殊对象. 由于平常用到Date着实不多,对它的了解颇浅.上周被问到怎么样获取某年某个月的天数,我当时想了一会儿,回答说有两种,一种自己写判断 ...

  2. js date对象传参获取特定日期的时间戳

    当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象inva ...

  3. js内置对象中获取时间的用法--通过date对象获取。

    Date对象: var today = new Date(); //年份: var year = today.getFullYear(); //月份 var month = today.getMont ...

  4. date对象获取get

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 回顾JS Date()对象

    突然想写一个日历插件发现Date对象的一些常识快忘光了,复习一下 new Date()返回当前时间 年月日 getFullYear() 返回年份 getMonth() 返回月份(因为从0开始算 所以要 ...

  6. php获取开始与结束日期之间所有日期的方法

    /** * 获取指定日期段内每一天的日期 * @param Date $startdate 开始日期 * @param Date $enddate 结束日期 * @return Array */ fu ...

  7. JS DATE对象详解

    1.建立时间对象:可获取年,月,日,星期,时,分,秒 var d = new Date(); console.log(d.getFullYear()+'年'+d.getMonth()+'月'+d.ge ...

  8. 扩展JS Date对象时间格式化功能

    在自己JS代码中引入一下代码: Date.prototype.format =function(format) { var o = { "M+" : this.getMonth() ...

  9. Safari浏览器中对js Date对象的支持

    看了一下自己上一次写博客还是3月份,那是还没有毕业,实习也没那么多事情,毕业设计也才刚开始做,那时天天晚上都把电脑带回家继续学习,而现在一工作忙为借口已经不怎么进行什么知识总结了,只是在印象笔记里做做 ...

随机推荐

  1. Java调用SQL Server的存储过程详解(转)

    1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: 以下是引用片段:{call proce ...

  2. testNG测试基础一

    1.TestNG概念 TestNG:Testing Next Generation 下一代测试技术,是一套根据JUnit和Nunit思想构建的利用注释来强化测试功能的测试框架,可用来做单元测试,也可用 ...

  3. Cypress测试工具

    参考博客:  https://testerhome.com/articles/19035 最近一段时间学习了cypress的测试工具, 她是一个端到端的测试web工具. 环境准备 1.工具:vs co ...

  4. [:space:]的用法(转)

    转自:http://blog.itpub.net/27181165/viewspace-1061688/ 在linux中通常会使用shell结合正则表达式来过滤字符,本文将以一个简单的例子来说明+,* ...

  5. SHOW SLAVE STATUS 详解

    MySQL同步功能由3个线程(master上1个,slave上2个)来实现.执行 DE>START SLAVEDE> 语句后,slave就创建一个I/O线程.I/O线程连接到master上 ...

  6. Linux让Apache支持中文URL图片/文件名

    需要用到iconv_hook和mod_encoding Apache(32位): 安装环境:CentOS 5.6 + Apache 2.2.15 (Apache2.4同样适用) 安装结果:安装后支持“ ...

  7. java Vamei快速教程05 实施接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...

  8. SPOJ - MATSUM Matrix Summation---二维树状数组

    题目链接: https://vjudge.net/problem/SPOJ-MATSUM 题目大意: 二维数组,两种操作 SET 将某点设置成x SUM 求某个区域之和 解题思路: 这里用二维树状数组 ...

  9. 2018.10.24 NOIP2018模拟赛 解题报告

    得分: \(100+0+100=200\)(\(T2\)悲惨爆\(0\)) \(P.S.\)由于原题是图片,所以我没有上传题目描述,只有数据. \(T1\):query(点此看题面) 熟悉主席树的人都 ...

  10. mongodb索引 全文索引使用限制

    全文索引非常强大,但是同样存在很多限制,我们来看以下去全文索引的使用限制: 1.每次查询,只能指定一个$text查询 2.$text查询不能出现在$nor查询中 之前没有接触过$nor查询,$nor查 ...