解析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的trigger和triggerHandler的区别示例介绍
Apr 20 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
Feb 28 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
微信小程序自动客服功能
Nov 02 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
Jan 31 Javascript
react-native使用leanclound消息推送的方法
Aug 06 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
Jul 16 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
Aug 08 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生成图片验证码的实例讲解
2015/08/03 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
Python中处理unchecked未捕获异常实例
2015/01/17 Python
django实现前后台交互实例
2017/08/07 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python机器学习之神经网络(三)
2017/12/20 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
python从子线程中获得返回值的方法
2019/01/30 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python进度条的制作代码实例
2019/08/31 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
商务日语毕业生自荐信范文
2013/11/14 职场文书
疾病捐款倡议书
2014/05/13 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Nginx 常用配置
2022/05/15 Servers
Redis基本数据类型String常用操作命令
2022/06/01 Redis