获取当前月(季度/年)的最后一天(set相关操作及应用)


Posted in Javascript onDecember 27, 2016

今天我就只说 setFullYear, setMonth, setDate,因为今天的应用只涉及到这三个。

这3个方法顾名思义分别设置年、月、日,之前我所了解到的应用,比如“倒计时”中设置目标时间点的时候会用到,其他的暂时记不起来,回头再补。

今天来说说“获取当前月(季度/年)的最后一天”的用法

你可能想到了,每个月的天数是不应定的,有28、29(闰年2月)、30、31,总不能去算一下现在是几月份,然后去arr或者map(json)里边去找对应的日期吧,当然这也是个方法,能达到效果(还要考虑闰年)。

那么,不这么繁琐的话,怎么搞呢?

其实,Date本来就会自动处理每月的天数,包括闰年什么的特殊情况,所以,这个我们根本不用去关心。

这里用到一个用法,估计大家有可能也用过,date.setDate(0)。没错,你没看错,就是0。(喂,这不是month啊,不用加1,你确定不是要用setDate(1) ?)

0是不存在的一天,date.setDate(0)之后,这一天不存在,或者说设置的是1号的前一天。那么,1号的前一天,自然就是前一个月的最后一天

var date = new Date();
console.log('今天是 ', date.getMonth() + 1, date.getDate());
date.setDate(0);
console.log('上个月最后一天是 ', date.getMonth() + 1, date.getDate());

控制台跑一下上边代码,就会得到上个月最后一天了。

继续,我们要得到的是这个月最后一天,怎么破

先把月份设置到下个月,然后获取这个月最后一天:

date.setMonth(date.getMonth() + 1);
date.setDate(0);

date就是这个月最后一天对应的date对象。

到此,简单地获取当月最后一天已经完了,改变setMonth可以让你获取任何一个月的最后一天了。

~~~~~~~~~~~~~~~~~~~~~~~~~   分割线   ~~~~~~~~~~~~~~~~~~~~~~

下面,来讲获取这一年的最后一天的date。

同理,我们只要设置到明年就可以了,然后设置月份到0月(就是1月),然后设置到0日,这样就成了2017-01-00,也就是元旦的前一天,当然也就是2016-12-31这天了。

date.setFullYear(date.getFullYear() + 1); // 设置到明年
date.setMonth(0); // 明年的0月,也就是对应到1月,是存在的哦,不是不存在的0
date.setDate(0); // 明年的0日

~~~~~~~~~~~~~~~~~~~~~~~~~  又来分割线   ~~~~~~~~~~~~~~~~~~~~~

然后,又到了获取当前季度的最后一天。

Date中是没有季度的概念的(如果有,请及时告诉我,让我多个知识点),所以,首先我们要判断当前月在哪个季度

var m = date.getMonth();
var quarter = Math.floor(m / 3) + 1; // 从1开始,到4
var qLastMonth = quarter * 3;

其中,quarter 是第几季度,qLastMonth 是这个季度的最后一个月是几月 // 从1开始到12,当年可以减去1,从0到11。

既然拿到了这个季度的最后一个月是几月,那再用上边的获取任一月份的最后天的方法来处理就好了

date.setMonth(qLastMonth);
date.setDate(0);

这时候,date就是当前季度的最后一天的date对象了。当然,做一下扩展就可以拿到任意季度的最后一天,只要在第一步设置(喂喂,干嘛呢,绕远了)

要拿到任意季度的最后一天,比如第2季度,只需要。。。 

date.setMonth(6); // 4 || 5 || 6 都行
date.setDate(0);

最后,来一个项目中遇到的实际应用里子

是酱紫的:

  1. 获取本季度的最后一天; 当今天是当前季度最后一天切大于15日的时候(比如6月20日),返回下个季度的最后一天。
  2. 获取本年最后一天;当今天是大于12月15日的时候,返回明年的最后一天。

开始的实现代码如下:

/**
 * 获取 当前月/当前年/当前季度 的最后一天的date对象
 * @param {String} type 类型选择: month/m, year/y, quarter/q
 * @return {object} 最后一天的date对象,目前只可用到天
 */
var SERVER_TIME = Date.now() / 1000; // 服务器时间,这里用本地时间代替
function getMaxDate(type) {
 var date = new Date(SERVER_TIME * 1000);
 var m = date.getMonth();
 var y = date.getFullYear();
 var d = date.getDay();
 var today = date.getDate();
 console.log(['SERVERTIME: ',y,'-',m+1,'-',today,' 星期',d].join(''));
 switch (type) {
 case 'm':
 case 'month':
  date.setMonth(m + 1);
  date.setDate(0);
  break;
 case 'y':
 case 'year':
  if (m == 11 && today >= 15) {
  date.setFullYear(y + 2);
  } else {
  date.setFullYear(y + 1);
  }
  date.setMonth(0);
  date.setDate(0);
  break;
 case 'q':
 case 'quarter':
  var qLastMonth = (Math.floor(m / 3) + 1) * 3;
  date.setMonth(qLastMonth);
  date.setDate(0);
  if (m === date.getMonth() && today >= 15) {
  date.setMonth(qLastMonth + 3);
  date.setDate(0);
  }
  break;
 default:
  date = null;
 }
 return date;
}

然后,这段代码有个大坑,平时还不一定能遇到,这不到年底了么,它就出来了(还好不是千年虫之类的千年一遇)

季度选择的时候,36行或导致后边的38行的代码块出问题。

比如第2季度,是没有问题的。36行设置date的日到30号,即6月30日;假如满足38行代码逻辑的话,39-40行设置月份到9月30日,没毛病,完美~

但是,假如现在是第1季度,36行设置日期到3月31日;假如满足38行代码逻辑的话,39-40行设置月份到6月31日,阿西吧,6月没有31日,那么这时候得到的date,就会是~~~~没错,7月1日,自挖坑啊。

所以,改代码

function getMaxDate(type) {
 var date = new Date(SERVER_TIME * 1000);
 var m = date.getMonth();
 var y = date.getFullYear();
 var d = date.getDay();
 var today = date.getDate();
 console.log(['SERVERTIME: ', y, '-', m + 1, '-', today, ' 星期', d].join(''));
 switch (type) {
 case 'm':
 case 'month':
  date.setMonth(m + 1);
  date.setDate(0);
  break;
 case 'y':
 case 'year':
  if (m == 11 && today >= 15) {
  date.setFullYear(y + 2);
  } else {
  date.setFullYear(y + 1);
  }
  date.setMonth(0);
  date.setDate(0);
  break;
 case 'q':
 case 'quarter':
  var qLastMonth = (Math.floor(m / 3) + 1) * 3;
  if (m === date.getMonth() && today >= 15) {
  date.setMonth(qLastMonth + 3);
  } else {
  date.setMonth(qLastMonth);
  }
  date.setDate(0); // 得到当前季度最后一天的date
  break;
 default:
  date = null;
 }
 return date;
}

这里得到一个注意项,月份的相关判断,一定要在日的设置之前做好,不要再日期设置后在操作月份;或者你把日期设置到1-28之间任意数字,也就是保证不会跑到下一个月去。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Jquery 基础学习笔记之文档处理
May 29 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
Jun 09 Javascript
parentElement,srcElement的使用小结
Jan 13 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
js中this的用法实例分析
Jan 10 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
Apr 17 Javascript
JSX在render函数中的应用详解
Sep 04 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
Nov 19 Javascript
javascript实现文字无缝滚动
Dec 27 #Javascript
JavaScript仿聊天室聊天记录
Dec 27 #Javascript
基于jQuery实现顶部导航栏功能
Dec 27 #Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 #Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 #Javascript
JS正则表达式修饰符global(/g)用法分析
Dec 27 #Javascript
js点击任意区域弹出层消失实现代码
Dec 27 #Javascript
You might like
使用URL传输SESSION信息
2015/07/14 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python先序遍历二叉树问题
2017/11/10 Python
python三引号输出方法
2019/02/27 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
2014年乡镇植树节活动方案
2014/02/28 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
排查MySQL生产环境索引没有效果
2022/04/11 MySQL
python manim实现排序算法动画示例
2022/08/14 Python