解析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操作input值的各种方法总结
Nov 21 Javascript
用js传递value默认值的示例代码
Sep 11 Javascript
javascript中call apply 与 bind方法详解
Mar 10 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
Angular 应用技巧总结
Sep 14 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
Webpack path与publicPath的区别详解
May 03 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 Javascript
VUE-cli3使用 svg-sprite-loader
Oct 20 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
JS面向对象编程实现的拖拽功能案例详解
Mar 03 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 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
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
索趣科技的答案
2007/02/07 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
python追加元素到列表的方法
2015/07/28 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Python input函数使用实例解析
2019/11/22 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
会计自我鉴定范文
2013/10/06 职场文书
大学生就业意向书范文
2014/04/01 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
工伤事故证明
2014/10/20 职场文书
免职证明样本
2014/10/23 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
初中政治教学工作总结
2015/08/13 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
Python中re模块的元字符使用小结
2022/04/07 Python