通过js date对象获取各种开始结束日期的示例
有时候做一些任务计划的功能时候,需要提供一个开始时间或者结束时间,比如本周结束,本月结束,今天结束等等,因此,我参考网上的资料把相关的实现为一个项目:
- gitee: https://gitee.com/dhclly/icedog.date-edge
- github: https://github.com/DHclly/icedog.date-edge/tree/master
执行测试用例,可以得到下面这种形式的结果:
当前的时间: 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对象获取各种开始结束日期的示例的更多相关文章
- js Date对象总结
Date在js中和Array类似,都是拥有自己的特殊方法的特殊对象. 由于平常用到Date着实不多,对它的了解颇浅.上周被问到怎么样获取某年某个月的天数,我当时想了一会儿,回答说有两种,一种自己写判断 ...
- js date对象传参获取特定日期的时间戳
当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象inva ...
- js内置对象中获取时间的用法--通过date对象获取。
Date对象: var today = new Date(); //年份: var year = today.getFullYear(); //月份 var month = today.getMont ...
- date对象获取get
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 回顾JS Date()对象
突然想写一个日历插件发现Date对象的一些常识快忘光了,复习一下 new Date()返回当前时间 年月日 getFullYear() 返回年份 getMonth() 返回月份(因为从0开始算 所以要 ...
- php获取开始与结束日期之间所有日期的方法
/** * 获取指定日期段内每一天的日期 * @param Date $startdate 开始日期 * @param Date $enddate 结束日期 * @return Array */ fu ...
- JS DATE对象详解
1.建立时间对象:可获取年,月,日,星期,时,分,秒 var d = new Date(); console.log(d.getFullYear()+'年'+d.getMonth()+'月'+d.ge ...
- 扩展JS Date对象时间格式化功能
在自己JS代码中引入一下代码: Date.prototype.format =function(format) { var o = { "M+" : this.getMonth() ...
- Safari浏览器中对js Date对象的支持
看了一下自己上一次写博客还是3月份,那是还没有毕业,实习也没那么多事情,毕业设计也才刚开始做,那时天天晚上都把电脑带回家继续学习,而现在一工作忙为借口已经不怎么进行什么知识总结了,只是在印象笔记里做做 ...
随机推荐
- Invoke 和 BeginInvoke 的区别(转发)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...
- iBrand 教程:Xshell 软件安装过程截图及配置
下载 教程中使用的相关软件下载网盘: https://pan.baidu.com/s/1bqVD5MJ 密码:4lku 安装 请右键以管理员身份运行进行软件安装,安装过程如下: 配置 安装完成并运行软 ...
- LeetCode Longest Substring Without Repeating Characters 最长不重复子串
题意:给一字符串,求一个子串的长度,该子串满足所有字符都不重复.字符可能包含标点之类的,不仅仅是字母.按ASCII码算,就有2^8=128个. 思路:从左到右扫每个字符,判断该字符距离上一次出现的距离 ...
- linux网卡的配置(解决刚刚安装linux,Xshell连接不上问题)
1.输入用户名和密码 2.cd到网卡文件夹 3.对网卡文件进行编辑 vi ifcfg-eth0 然后 a 进行编辑 然后esc退出,shift+zz保存 4.重启网卡 /etc/init.d/netw ...
- python_52_函数返回值2
def test1(x,y): print(x,y) test1(1,2)#位置参数调用,按顺序来,与形参一一对应 test1(y=1,x=2)#输出为2 1,不是1 2.关键字参数调用按关键字,不按 ...
- python_21_copy
import copy person=['name',['saving',100]] #3种浅copy方式 p1=copy.copy(person) p2=person[:] p3=list(pers ...
- SpringBoot学习记录(二)
一. SpringBoot日志框架 SpringBoot:底层是Spring框架,Spring框架默认是用JCL(commons-logging): SpringBoot选用SLF4j和logback ...
- DOM4j-中文API
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. ...
- git系列讲解
1.git是什么呢?维基百科给出的定义: git是一个分布式版本控制软件,最初由(Linus Torvalds)创作 什么是版本控制?项目经理与程序员的恩怨情仇企业真实案例:开发了a功能,之后项目所要 ...