专栏首页终身学习者JS 在获取当前月的最后一天遇到的坑

JS 在获取当前月的最后一天遇到的坑

腾讯云 热门云产品限量特惠秒杀,云服务器1核2G,99元/1年

海外1核2G服务器低至2折,半价续费券限量免费领取!

新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。

为了更好的讲这节的内容,提示一个 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号

所以不要认为 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 掌握JS函数中的几种参数形式(函数基础)

    函数是一段结合在一起执行特定任务的代码,函数一般使用参数与外部进行交互。要编写简洁高效的JS代码,必须掌握函数参数。

    前端小智@大迁世界
  • GraphQL 的入门指南

    今天最常讨论的术语之一是 API,很多人不知道 API 到底是什么,API 是 Application Programming Interface(应用程序编程...

    前端小智@大迁世界
  • 需要知道的JS的日期知识,都在这了

    JS中的 Date 很奇怪。当我们需要处理日期和时间的时候比较麻烦,经常借助像date-fns和 Moment 这样的库。

    前端小智@大迁世界
  • Js计算指定日期加上多少天,加多少月,加多少年的日期

    function DateAdd(interval,number,date) { /* * 功能:实现VBScript的DateAdd功能...

    庞小明
  • Java 多态

    由于A这个类没有与B建立联系,会报 ClassCastException ,可以通过类的转型来建立联系

    用户2965768
  • Springboot之启动原理

    SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步...

    用户3467126
  • Spring实战——XML和JavaConfig的混合配置

    前言 看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨。所以现在每次写完主要内容后,还需要对于格式稍稍调整下。那么有没...

    JackieZheng
  • 一文搞懂Spring-AOP原理

    爱撒谎的男孩
  • kvm虚拟磁盘设备全过程

    步骤:guest linux kernel 通过0xcf8 0xcfc端口遍历pci配置空间,遍历端口过程中被vm截获,传递给qemu,qemu中的pci配置信...

    jeff xie
  • 从隐式转换案例,来挖掘开发人员的技能提升

    碰到个问题(https://www.modb.pro/issue/1440),有点意思,值得在这说下。

    bisal

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动