解析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 上下左右键控制焦点(示例代码)
Dec 14 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
JS实现新建文件夹功能
Jun 17 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
Aug 17 Javascript
在vue项目中使用sass的配置方法
Mar 20 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
Jun 04 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
Aug 29 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
使用Python & Flask 实现RESTful Web API的实例
2017/09/19 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
记者岗位职责
2014/01/06 职场文书
消防器材管理制度
2014/01/28 职场文书
《日月潭》教学反思
2014/02/28 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
施工安全生产承诺书
2014/05/23 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书