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

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

当前的时间: 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. 使用HTML5 canvas做地图(1)基础知识

    之前一直想使用HTML5技术全新做一套地图API,可是苦于时间和精力,迟迟未有行动.后来下定决心,利用下班和周末做出一个大体框架出来,现在和网友分享一下自己的整体的一个思路和想法.欢迎大家提出宝贵建议 ...

  2. ArcGIS for Android 中实现要素绘制时固定MapView

    最近在项目中遇到这么一个情况,在MapView中要求实现绘制点.线.面. 在这里面就会遇到这么一个问题,绘制折线和多边形型时,每点击一个点屏幕就会跟着晃,使用起来很不方便(使用Note2 触控笔),所 ...

  3. Python高效开发实战——Django、Tornado、Flask、Twisted

    今天要推荐的就是这本书,内容涉及四种主流的Python Web开发框架,零基础完成网站搭建.数据库设计.前后端开发,全方位领悟Python原理与应用. 最新最全的框架实战,尽在这本书,可搜索亚马逊.京 ...

  4. cmd中不能输入中文

    在命令行窗口下不能输入中文,只能输入英文,这是因为cmd.exe窗口启动时并没有启动conime.exe进程.事实上,这个进程容易被后门病毒利用,因此网上很多人都把它当成病毒看待,一些网上下载的系统就 ...

  5. 基于spark Mllib(ML)聚类实战

        写在前面的话:由于spark2.0.0之后ML中才包括LDA,GaussianMixture 模型,这里k-means用的是ML模块做测试,LDA,GaussianMixture 则用的是ML ...

  6. JS.match方法 正则表达式

    match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. <sc ...

  7. 【BZOJ2754】[SCOI2012] 喵星球上的点名(后缀数组+莫队)

    点此看题面 大致题意: 每个人的名字由姓和名构成,如果某次点名点到的字符串是某人姓或名的一个子串,则这个人就被点到了.求每次点名被点到的人的个数及每个人被点到的总次数. 后缀数组+莫队 这道题做法很多 ...

  8. 【UVA10652】Board Wrapping(求凸包面积)

    点此看题面 大致题意: 告诉你若干个矩形的重心坐标.长.宽和相对\(y\)轴的偏转角度,求矩形面积和与能围住这些矩形的最小凸包面积之比. 矩形面积和 这应该是比较好求的吧. 已经给了你长和宽,直接乘起 ...

  9. wu2198:难得的波段抄底机会

    很好的波段抄底机会 个人浅见看,目前染料股跌出的机会明显,养殖股波段机会明显,芯片.半导体.集成电路.北导.软件.国产操作系统等科技股短线机会不错.另外,大盘指数2856/2806区域的波段操作机会不 ...

  10. Linux 下MySQL数据库配置远程访问

    1. mysql -u root -p 第一次直接回车跳过密码 2. use mysql; 3.执行授权命令 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDE ...