解析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 相关文章推荐
jQuery timers计时器简单应用说明
Oct 28 Javascript
jQuery中siblings()方法用法实例
Jan 08 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
浅谈Node.js之异步流控制
Oct 25 Javascript
深入理解Vue官方文档梳理之全局API
Nov 22 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
layui实现多图片上传并限制上传的图片数量
Sep 26 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/06 冲泡冲煮
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
vuex实现及简略解析(小结)
2019/03/01 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
python 自动提交和抓取网页
2009/07/13 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
python装饰器深入学习
2018/04/06 Python
python看某个模块的版本方法
2018/10/16 Python
Python 使用多属性来进行排序
2019/09/01 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
2014年大班元旦活动方案
2014/02/26 职场文书
中层干部培训方案
2014/06/16 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
导航工程专业自荐信
2014/09/02 职场文书
2014年技术部工作总结
2014/12/12 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
python基础之文件处理知识总结
2021/05/23 Python