解析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控制表单奇偶行样式的简单方法
Jul 31 Javascript
json格式的时间显示为正常年月日的方法
Sep 08 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 Javascript
window.print打印指定div实例代码
Dec 13 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
javascript常用的方法分享
Jul 01 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
javascript正则表达式总结
Feb 29 Javascript
vue+swiper实现侧滑菜单效果
Dec 28 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 Javascript
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
Jun 15 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 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
event.srcElement+表格应用
2006/08/29 Javascript
jQuery 动画基础教程
2008/12/25 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
Python原始字符串(raw strings)用法实例
2014/10/13 Python
python中enumerate函数用法实例分析
2015/05/20 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
python 接收处理外带的参数方法
2018/12/03 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
python写程序统计词频的方法
2019/07/29 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
浅析python实现动态规划背包问题
2020/12/31 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
幼儿园新学期寄语
2014/01/18 职场文书
学生会部长竞聘书
2014/03/31 职场文书
工厂标语大全
2014/10/06 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
给客户的检讨书
2014/12/21 职场文书