解析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 相关文章推荐
JS实现浏览器菜单命令
Sep 05 Javascript
Javascript之文件操作
Mar 07 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
基于jQuery实现的图片切换焦点图整理
Dec 07 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
jquery+json实现数据二级联动的方法
Nov 28 Javascript
简单讲解AngularJS的Routing路由的定义与使用
Mar 05 Javascript
Easyui和zTree两种方式分别实现树形下拉框
Aug 04 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Python中str.format()详解
2017/03/12 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
Django中ORM的基本使用教程
2020/12/22 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
人力资源经理自我评价
2014/01/04 职场文书
优秀通讯员事迹材料
2014/01/28 职场文书
书香校园活动方案
2014/02/28 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python