解析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 13 Javascript
$.format,jquery.format 使用说明
Jul 13 Javascript
前端开发过程中浏览器版本的两种判定方法
Oct 30 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
Angular2内置指令NgFor和NgIf详解
Aug 03 Javascript
JavaScript订单操作小程序完整版
Jun 23 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
2种简单的js倒计时方式
Oct 20 Javascript
JS中Promise函数then的奥秘探究
Jul 30 Javascript
layui自定义ajax左侧三级菜单
Jul 26 Javascript
websocket4.0+typescript 实现热更新的方法
Aug 14 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实现ping
2006/10/09 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
java必学必会之static关键字
2015/12/03 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Numpy之random函数使用学习
2019/01/29 Python
python进行参数传递的方法
2020/05/12 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
Python实现疫情地图可视化
2021/02/05 Python
介绍一下Linux文件的记录形式
2013/09/29 面试题
餐饮总经理岗位职责
2014/03/07 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
经理岗位职责范本
2015/04/15 职场文书
幸福终点站观后感
2015/06/04 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python