解析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 距离某一时间点时间是多少实现代码
Oct 14 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
轻松掌握JavaScript享元模式
Aug 27 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
原生JS控制多个滚动条同步跟随滚动效果
Dec 22 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
Vue中axios拦截器如何单独配置token
Dec 27 Javascript
VUE动态生成word的实现
Jul 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
隐藏你的.php文件的实现方法
2007/03/19 PHP
php && 逻辑与运算符使用说明
2010/03/04 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP生成器简单实例
2015/05/13 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
详解Python中的动态属性和特性
2018/04/07 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
酒吧副总经理岗位职责
2013/12/10 职场文书
办公室文员自荐书
2014/02/03 职场文书
诉前财产保全担保书
2014/05/20 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
抗洪救灾标语
2014/10/08 职场文书
担保书范本
2015/01/20 职场文书
律政俏佳人观后感
2015/06/09 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
生产设备维护保养制度
2015/08/06 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js
vue+iview实现手机号分段输入框
2022/03/25 Vue.js