【五渣小Tips】今天是今年的第几周

439 阅读5分钟

距离上一次写博客已经快一年半了,有点生疏了,一方面是不知道写点什么,不想跟大部分面试向总结一样,只想写点自己感兴趣的。还有一方面是这一年发生的事情太多,疫情,到现在还没有结束,前两周刚打了第二针疫苗。非典学会众志成城,新冠学会共克时艰。然后经历了人生几件大事,结婚,买车,买房,装修,筹办婚礼。最后一方面可能是因为自己有点懒了🐶

为什么算这个

目前公司业务算是电商吧,所以会经常有营销活动,这个活动呢,有一个需求就是可以设置这个活动是用户生日当天,还是生日当周,还是生日当月发放,然后我需要一个弹窗来提醒用户给他发这个活动的优惠了。当时觉得很简单,不就是拿到客户的生日,然后简单算一下不就ok了,况且还有像dayjsmoment这种优秀的计算时间的库,我愁什么,然后就把弹窗的逻辑放到最后来写了。但是当写这个逻辑的时候。。。。傻眼了。。。

我们先忽略计算当天和当月。。这个真的没必要说,没什么好计算的。。。主要说一下计算当前周是否是生日当前周

ISO 8601

我们既然要计算今天是今年的第几周,那我们就得有个标准,毕竟我们每年的一月一日不都是星期一,要不就好算了。那大部分时候一月一日都是一周的中间几天,那怎么算,这一周是算去年的最后一周,还是今年的一周呢。这个时候就需要这个标准了——国际标准ISO 8601 wiki 国际标准ISO 8601 baidu

这个标准有很多定义,我们只挑里面的周,星期的定义来看

wiki解释

总结一下就是第一个周四所在的周,就是当年的第一周。因为如果周四在这一周,这一周起码有四天在今年年内,而上一年则最多三天,多胜少,所以这周不属于上一年,而是属于今年的。

现在我们搞清了从哪天开始算第一周,那我们就可以着手计算了

理所应当首先想到用 Moment.js

我们来找一个日期吧,比如今年的6月27日(鄙人的婚期 2021年6月27日)

image.png

那么来看一下今年这个特殊的日子今年的第几周呢

const moment = require('moment');

// 我今年可以说最重要的日子了
const myBigDay = '2021-06-27';

const myBigWeek = moment(myBigDay).week();

console.log(myBigWeek) // 27

哇塞~~~原来是第27周啊😄😄😄。

那我按照刚才的需求,我应该是当周向亲朋好友来发送请帖,所以我得知道当天是不是结婚当周,比如“2021-06-24”

image.png 那我们让我们的小代码来跑一下

const moment = require('moment');

// 我今年可以说最重要的日子
const myBigDay = '2021-06-27';

const myBigWeek = moment(myBigDay).week();

console.log(myBigWeek) // 27

const sendInvitation = moment('2021-06-24').week() === myBigWeek;

if (sendInvitation) {
  console.log('我今天要发送我的婚礼请帖咯~~')
} else {
  console.warn('还没到婚礼那周呢!!')
}

// 还没到婚礼那周呢!!

怎么事与愿违?

什么!!竟然不是婚礼那周???

奇怪了,明明婚礼是周日,我周四发请帖没有错啊,为什么会出现这种情况!!这不耽误大事了嘛(其实当时开发时候是测试发现这个问题的😛,用户周日的生日,周五竟然没有弹窗)

后来经过我聪明的小脑袋瓜,想起了小学英语老师说过为什么周日是Sunday太阳日,因为Sunday是一周的第一天。 介不*蛋了嘛,经过我一番努力啊,真的是。。。当时项目用的dayjs,那个文档真的是简略啊,后来查看momentjs的文档,原来是可以通过传参的。

image.png

左边是moment.js的,右边是dayjs文档,高下立判啊!!使用dayjs也不告诉我怎么改成周一是一周的第一天😒

经过改造

const moment = require('moment');

// 告诉moment,China No.1,我是中国人
moment.locale('zh-CN');

// 我今年可以说最重要的日子
const myBigDay = '2021-06-27';

const myBigWeek = moment(myBigDay).week();

console.log(myBigWeek) // 25

const sendInvitation = moment('2021-06-24').week() === myBigWeek;

if (sendInvitation) {
  console.log('我今天要发送我的婚礼请帖咯~~')
} else {
  console.warn('还没到婚礼那周呢!!')
}

// 我今天要发送我的婚礼请帖咯~~

这样我才能在合理的时间发出我的请帖,公司需求才能真正的给用户正确的弹窗提醒,这才算是 Done!

我们来自己实现吧~

废话不多说,我们直接来实现一个方法获取当前周是第几周

const getWeekNum = (date) => {
  let day = new Date(date);
  // 设置成最近的周四
  day.setDate(day.getDate() + 4 - (day.getDay() || 7));
  // 找出今年第一天的时间
  const yearFirstDay = new Date(day.getFullYear(), 0 , 1);
  // 算出今天离今年第一天过去多长时间了
  // 算出过了多少天,然后算出过了多少周
  const weekNum = Math.ceil(((day - yearFirstDay) / 86400000 ) / 7)
  return weekNum
}

// 我今年可以说最重要的日子
const myBigDay = '2021-06-27';

const myBigWeek = getWeekNum(myBigDay);

console.log(myBigWeek) // 25

const sendInvitation = getWeekNum('2021-06-24') === myBigWeek;

if (sendInvitation) {
  console.log('我今天要发送我的婚礼请帖咯~~')
} else {
  console.warn('还没到婚礼那周呢!!')
}

// 我今天要发送我的婚礼请帖咯~~

就是如此简单哦~~

总结

这么一个简单的计算周,当时也算是遇到几点坎坷吧,但最后也算顺利结束了。2021年第一篇,激动激动,虽然不是什么深奥的技术,比如现在常见的webpack原理咯,手写promise咯,event loop咯,hook咯,但是确实是我工作学习中碰到的小问题,记录一下。就到这吧,

听说路飞跟凯多打起来了,我也该补补海贼王了


我是五渣,想拿五杀