Date小技巧:set相关操作及应用_获取当前月(季度/年)的最后一天
set操作还是有不少的,具体见 http://www.w3school.com.cn/jsref/jsref_obj_date.asp,
今天我就只说 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);
2 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之间任意数字,也就是保证不会跑到下一个月去。
bla~bla~说了一堆,有些废话,反正是有感而写,就当一次记录吧~~
see U
Date小技巧:set相关操作及应用_获取当前月(季度/年)的最后一天的更多相关文章
- nova相关操作的Request_Id的获取
在分析nova的众多log文件时,如nova-api,nova-scheduler,nova-compute等,其中的request id是串联起整个flow的关键词. 而通过nova instanc ...
- Bootstrap 小技巧以及相关资源整理
1, Bootstrap Bundle (http://bootstrapbundle.com/): 提供了15中不同的MVC Bootstrap模板.[扩展和更新]中搜索“Bootstrap Bu ...
- 积累的VC编程小技巧之文件操作
1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){ CString path = ...
- 积累的VC编程小技巧之树操作
1.如何在TreeList中加图标? [问题提出] 请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀? [解决方法] 1) HICON ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- select标签的相关操作,选中,获取option的值,二级联动
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(二)
对li标签的相关操作——8种方式获取li标签的第一个元素的内容 1.alert($("ul>li").first().html());2.alert($('ul>li' ...
- JS、JQ相关小技巧积攒
JS.JQ相关小技巧积攒,以备不时之需. 1.js 获取时间差:时间戳相减.new Date().getTime() 获得毫秒数,除以(1000*60*60*24) 获得天数. 2.重定向操作:页面 ...
- 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...
随机推荐
- DockerCon 2016 – 微软带来了什么?
根据Forrester的调查,接近半数的企业CIO在考虑IT架构的时候更乐于接受开源方案,这主要是基于低成本,避免供应商锁定和敏捷的需求:同时另外一家North Bridge的调研机构的调查显示,20 ...
- NOIP2016纪录[那些我所追求的]
人生第一场正式OI [序] 2016-12-04 见底部 [Day -1] 2016-11-17 期中考试无心插柳柳成荫,考了全市第2班里第1(还不是因为只复习了不到两天考试),马上请了一个周的假准备 ...
- BZOJ 2119: 股市的预测 [后缀数组 ST表]
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 331 Solved: 153[Submit][Status][Discuss ...
- 2DToolkit官方文档中文版打地鼠教程(一):初始设置
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...
- eclipse,myeclipse 误删文件,回滚历史文件操作
昨天因为误操作把一个写了一上午的代码给删了,找到的这个,以前竟然还没发现有这个功能- -! 具体操作: 1.建立同路径同名的文件 2.文件上右键 --> Compare With --> ...
- mono for android学习过程系列教程(5)
这一讲主要需要了解的安卓UI元素是Spinner.这个元素类似我们 winform和webform里面的下拉选项. 首先我们先建立一个新的项目,命名为SpinnerExample. 然后在Layout ...
- 细说SSO单点登录
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- Python标准模块--multiprocessing
1 模块简介 multiprocessing模块在Python2.6中引入.最初的multiprocessing是由Jesse Noller和Richard Oudkerk在PEP 371中定义.就像 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
系列目录 补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表的Index代码就可以 加上几个按钮就可以了 <div class="mvctool"> ...