解析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 相关文章推荐
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
jquery.form.js用法之清空form的方法
Mar 07 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
解决jQuery使用JSONP时产生的错误
Dec 02 Javascript
Bootstrap项目实战之首页内容介绍(全)
Apr 25 Javascript
js调用webservice构造SOAP进行身份验证
Apr 27 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
JS触摸与手势事件详解
May 09 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
mockjs+vue页面直接展示数据的方法
Dec 19 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
模拟flock实现文件锁定
2007/02/14 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
年度献血先进个人事迹材料
2014/02/14 职场文书
低碳环保倡议书
2014/04/14 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
黄河绝恋观后感
2015/06/08 职场文书
大学班干部竞选稿
2015/11/20 职场文书
小学班主任心得体会
2016/01/07 职场文书