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根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...
随机推荐
- jquery.multiselect 多选下拉框实现
第一步:链接下列文件,如果没有,到此网页下载 https://github.com/ehynds/jquery-ui-multiselect-widget,此插件基于jquery ,所以jquery的 ...
- 豪情-CSS解构系列之-新浪页面解构-01
目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...
- Ubuntu(Linux) + mono + xsp4 + nginx +asp.net MVC3 部署
折腾了一下,尝试用Linux,部署mvc3. 分别用过 centos 和 ubuntu ,用ubuntu是比较容易部署的. 操作步骤如下: 一.终端分别如下操作 sudo su ->输入密码 a ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribu ...
- maven archetype二三事
maven plugin 创建maven archetype 骨架的plugin是 <plugin> <groupId>org.apache.maven.plugins< ...
- dhcp协议交互报文
DHCP共有八种报文,分别为DHCP Discover.DHCP Offer.DHCP Request.DHCP ACK.DHCP NAK.DHCP Release.DHCP Decline.DHCP ...
- LLBL Gen Pro 5.0 企业应用开发入门
Solutions Design 公司于2016年5月发布了LLBL Gen Pro 5.0,这个新版本的发布出乎于我的意料.我的猜想是从4.2升级到4.5,再升级5.x版本,主版本号的变更会给原有客 ...
- ★Kali信息收集~★6.Dmitry:汇总收集
概述: DMitry(Deepmagic Information Gathering Tool)是一个一体化的信息收集工具.它可以用来收集以下信息: 1. 端口扫描 2. whois主机IP和域名信息 ...
- 如何写复杂的SQL
经常有人问我那非常复杂的sql是怎么写出来的,我一直不知道该怎么回答. 因为虽然我写这样的sql很顺手,可是我却不知道怎么告诉别人怎么写. 很多人将这个问题归结为天赋,我却不这么看,我 ...