解析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 相关文章推荐
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
纯js实现仿QQ邮箱弹出确认框
Apr 29 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
iview table高度动态设置方法
Mar 14 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
对类Vue的MVVM前端库的实现代码
Sep 07 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
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
星际争霸秘籍
2020/03/04 星际争霸
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
web前端开发也需要日志
2010/12/09 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
python属于跨平台语言码
2020/06/09 Python
市场营销管理毕业生自荐信
2014/03/03 职场文书
第二课堂活动总结
2014/05/07 职场文书
村委会贫困证明范文
2014/09/21 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
车队安全员岗位职责
2015/02/15 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
家庭贫困证明
2015/06/16 职场文书
导游词之神仙居景区
2019/11/15 职场文书
Python基础之条件语句详解
2021/06/16 Python
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫