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

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

当前的时间: 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. sublime 主要使用方法

    ---------------最常用的1.新建文件-输入"html:xt"后 按"Ctrl+E键"或 "tab键" ,可快速生成xhtml ...

  2. weex 项目开发 weexpack 项目 打包、签名、发布

    一. weexpack build android  和  weexpack run android 的 区别. (1)单纯打包 weexpack build android (2)打包并运行 wee ...

  3. logback的加载过程

    使用logback-classic.jar时,启动应用后,logback按照以下顺序进行扫描: 1.在系统配置文件System Properties中寻找是否有logback.configuratio ...

  4. SQL Server 08版与14版处理重复行的方式

    在项目中,利用循环拼接成了插入多行数据的SQL语句: Insert into table(col1,col2)vaules(value11,value21); Insert into table(co ...

  5. 面试官:自己搭建过vue开发环境吗?

    开篇 前段时间,看到群里一些小伙伴面试的时候被面试官问到这类题目.平时大家开发vue项目的时候,相信大部分人都是使用 vue-cli脚手架生成的项目架构,然后 npm run install 安装依赖 ...

  6. map 容器(copy)

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本的构造函数:   map<stri ...

  7. 一键备份脚本 backup.sh

    做网站最重要的是什么?数据!数据,是网站之本,备份,是每一个站长都应该重视的事情.但同时,备份也是一件繁琐和重复的事情.所以,这些事情,肯定能做到自动化的.下面来介绍一下这个一键备份脚本 backup ...

  8. python_66_生成器2

    import time def consumer(name): print('%s准备吃包子 '%name) while True: baozi=yield print('包子[%s]来了,被[%s] ...

  9. python_24_test

    product_list=[ ('Iphone',5800), ('Mac Pro',9800), ('Bike',800), ('Watch',10600), ('Coffee',31), ('Py ...

  10. C++手写快读详解(快速读入数字)

    众所周知,C++里是自带读入的(这不废话吗) 例如: int a; cin>>a; 这样的读入理解简单,适合初学者,但是非常慢. 再例如: int a; scanf("%d&qu ...