【JS篇】获取当天所在的一周、前一周、下一周的日期和星期信息

前言

开发中,遇到需要获取一周的日期,并能够进行上下周的切换,设计稿见下图,但现有的组件库中日历组件无法达到设计稿需求,且现有日历组件一般都是展示一个完整的月份或年份,并没有展示一周日期信息的组件,因此决定查找资料自行制作一个周日历组件。

最终完成效果如下:
在这里插入图片描述
在这里插入图片描述

实现

样式布局这里就不赘述了,主要说说JS如何获取星期信息。

网上查找参考资料后(参考文章链接见文末),将方法进行一番改造,可适用于多种场景,具体代码如下:

// 根据参数日期获取具体日期信息
export const formatDate = function (date = new Date()) {
  let year = date.getFullYear();
  let month = (date.getMonth() + 1) ;
  let day = date.getDate();
  let week = ['天', '一', '二', '三', '四', '五', '六'][date.getDay()];
  
  const dateInfo = {
    date: new Date(date),
    dateStr: `${year}-${month.toString().padStart(2,'0')}-${day.toString().padStart(2,'0')}`,
    year,
    month,
    day,
    week,
    isToday:false
  }
  
  const today = new Date();
  // 判断是否为当天
  if (today.getFullYear() === year && (today.getMonth() + 1) === month && today.getDate() === day) {
    dateInfo['isToday'] = true;
  }
  return dateInfo;
};

// 根据基准日期,获取长度为dayLenth的日期数组
export const setDate = function (date = new Date(), step = 7) {
  let weekData = [];
  const week = date.getDay() - 1;
  date = getDateByDate(date, week * -1);
  for (let i = 0; i < step; i++) {
    weekData.push(formatDate(i == 0 ? date : getDateByDate(date, 1)))
  }
  return weekData;
};

// 根据基准日期获取前后某天的日期对象
export const getDateByDate = function (date = new Date(), range = 0) {
  date.setDate(date.getDate() + range);
  return date;
};

/* 
  获取以baselineDate所在周的一周、前一周、下一周的日期和星期信息(切换周期也可通过参数dayLenth自行设置)
  baselineDate: 设置的基准日期(返回的日期列表的第一个日期)
  range: 以 baselineDate 为基准日期的前后天数范围(如基准日期的range为0,需要返回前7天日期,则range为-7,后7天则range为7)
  step: 需要获取的日期信息周期天数,默认获取baselineDate所在周的一周日期信息
 */
export const getWeekDate = ({baselineDate = new Date(), range = 0, step = 7}) => {
  return setDate(getDateByDate(baselineDate, range), step);
};

调用:

// 获取当天所在星期数据
getWeekDate({baselineDate:new Date()})

// 获取以当天为基准日期的上星期数据
getWeekDate({
	baselineDate: new Date(),
	range: -7
})

// 获取以当天为基准日期的下星期数据
getWeekDate({
	baselineDate: new Date(),
	range: 7
})

formatDate 和 getDateByDate 方法可单独使用,如:

// 获取当天日期信息
formatDate(getDateByDate());

返回以下数据格式:

在这里插入图片描述

额外知识补充:

// ES6的字符串方法:日期、月份补零。2的意思是字符串长度不能小于2
month.toString().padStart(2,'0')

本文 参考文章链接:https://blog.51cto.com/wangjinchan/5256416

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章魚尐芄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值