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

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

当前的时间: 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. 【Quartus错误】Internal Error: Sub-system: AMERGE

    错误内容:Internal Error: Sub-system: AMERGE, File: /quartus/atm/amerge/amerge_kpt_op.cpp, Line: 220 解决方案 ...

  2. tomcat 启动显示指定的服务未安装

    解决方法: 命令行进入tomcat的bin目录 输入“service.bat install” 重启,OK

  3. ZooKeeper保证之单一视图(Single System Image)

    由于ZooKeeper的数据模型简单且全部在内存中,ZooKeeper的速度非常快.它提供了一系列保证(Guarantees): • 顺序一致性(Sequential Consistency) • 原 ...

  4. java +selenuim使用js显示控件

    操作selenium控件时,往往需要有些控件提前显示,特别是后台的一些控件,或者需要使用鼠标显示下拉的操作,有时鼠标悬停,在点击不怎么好使,就可以依靠js方式,提前让控件显示. 1.使用style的方 ...

  5. hdu-1317 XYZZY---Floyd判连通+bellman最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 题目大意: 题意:有n个房间(n<=100),每个房间有一个点权(第1号房间和第n号房间 ...

  6. Android(java)学习笔记83:各种边距设置

    1. 各种边距设置: (1)android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 (2)android:layout_marginLeft 外边距,对谁用,指的 ...

  7. 回归树的原理及Python实现

    大名鼎鼎的 GBDT 算法就是用回归树组合而成的.本文就回归树的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 1. 原理篇 1.1 最简单的模型 如果预测某个连续变量的大小,最简单的模型之一 ...

  8. 在 Java 8 中避免 Null 检查

    如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一.而且中级和高级程序员也在时时刻刻规避这个错误.其是迄今为止 Java ...

  9. 博学谷-数据分析pandas

    import pandas as pd df=pd.read_csv() df=pd.read_sql()

  10. STL MAP使用注意事项

    Hat’s Words A hat’s word is a word in the dictionary that is the concatenation of exactly two other ...