解析JS在获取当前月的最后一天遇到的坑


Posted in Javascript onAugust 30, 2019

为了更好的讲这节的内容,提示一个 JS 处理日期的小技巧,想获取上个月最后一天,只需要设置SetDate参数为0即可。

var endDate = new Date();
//上个月最后一天
endDate.setDate(0);

接着正文开始:

使用 JS 获取当前月的最后一天,咱们通常的思路先获取下个月的第一天,然后在减去一天,就是当前月的最后一天,所以自然会用到下面的代码:

var date= new Date();
date.setMonth(date.getMonth() + 1);
//日期设置为0号, 0表示1号的前一天
let lastDay = date.setDate(0);
console.log('最后一天:' + new Date(lastDay).toLocaleString())

我写此文的日期是2019.08.21,所以打印结果如下:

最后一天:2019/8/31 下午4:10:43

那这样的算法有没有bug,咱们并不确定,所以为了还原现场,现在咱们从2019.01.31一个一个来试试

var date= new Date(2019, 0, 31); //0 表示1月
date.setMonth(date.getMonth() + 1);
// 日期设置为0号, 0表示1号的前一天
let lastDay = date.setDate(0);
console.log('最后一天:' + new Date(lastDay).toLocaleString())

打印:

最后一天:2019/2/28 上午12:00:00

咱们可以看到,我们把 1月31号往后拨一个月在往前减一天,理应得到的是 1月31号,实际得到的是 2月28号,所以咱们写的代码是有bug的。

这又是怎么肥事?

咱们可以列出月份:

1月 1 ....... 28 29 30 31
2月 1 ....... 28
3月 1 ....... 28 29 30 31

咱们通过 month + 1,在 JS 中会理解成:

当前日期 + 当月的天数

所以上例中的 date.setMonth(date.getMonth() + 1) 等价于 1月31号 + 31天 ,根据上面的列表,就可以看到结果是3月3号

解析JS在获取当前月的最后一天遇到的坑

所以不要认为 month + 1 就是月份加 1,它的意思是当前日期加上当月天数 。

那要怎么保证多了不会多跳一个月呢?

只要保证 month + 1 之前不会超过28号就行啦,那要怎么做到呢?

推算:

  • 31号 + 31 会超
  • 30号 + 31 会超
  • 29号 + 31 会超
  • 28号 + 31 还是 28 号 刚好

所以秘诀在把31号回拨到28号就行啦,所以多加以下这句话就行了:

date.setDate(28)

完整代码:

var date= new Date(2019, 0, 31); //0 表示1月
date.setDate(28)
date.setMonth(date.getMonth() + 1);
// 日期设置为0号, 0表示1号的前一天
let lastDay = date.setDate(0);
console.log('最后一天:' + new Date(lastDay).toLocaleString())

运行结果:

最后一天:2019/1/31 上午12:00:00

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具Fundebug。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript fullscreen全屏实现代码
Apr 09 Javascript
jquery.post用法示例代码
Jan 03 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
js全选按钮的实现方法
Nov 17 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
Dec 02 Javascript
详解extract-text-webpack-plugin 的使用及安装
Jun 12 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
javascript canvas实现简易时钟例子
Sep 05 Javascript
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
Node实现搜索框进行模糊查询
Jun 28 Javascript
Vue函数式组件的应用实例详解
Aug 30 #Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 #Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 #Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 #Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 #Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 #Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 #Javascript
You might like
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
PHP中设置时区方法小结
2012/06/03 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
Js四则运算函数代码
2012/07/21 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
vue实现轮播图帧率播放
2021/01/26 Vue.js
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
flask session组件的使用示例
2018/12/25 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
地球一小时倡议书
2014/04/15 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
校园之声广播稿
2015/08/18 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS