js moment.js 给定时间 获取自然月、周的时间轴

1.需求

请添加图片描述
要实现这个时间轴的自然周、自然月的选择功能,需要思考两个问题

  1. 处理给定时间的本周与本月时间的显示,如输入 2021-07-29,最后一个月就是 2021-07-01 -
    2021-07-29,最后一周就是 2021-07-26 - 2021-07-29
  2. 获取往前的自然月和周的第一天和最后一天(每周固定七天好处理,每月的天数不确定,需要特殊处理)

2.给定时间 获取自然月、周的时间范围

处理周参数思路

moment().weekday(0) 设置日期为当前时区周一
moment().weekday(6) 设置日期为当前时区周日

处理月参数思路
当前月的最后一天的时间戳等于上个月的最后一天 + 24 _ 3600
const day1Unix = moment().date(1)).unix() // 获取当月 1 号日期时间戳
const dayLast = moment.unix(day1Unix - 24 _ 3600) // 获得上个月最后一天日期

根据上面的思路

3.获取时间轴 list

// 导入moment 并设置时间区域为中国
import moment from 'moment'
moment.locale('zh-cn')
/**
 * 根据时间刻度 day week month 生成对应的时间段列表
 * step: 时间段刻度 day | week | month
 * num: 输出多少组数据
 * displayTimeFormat: 显示时间的格式(可自定义)
 * rangeTimeFormat: 时间范围的格式(可自定义)
 */
export const getRangeTimeList = function(
  step,
  num = 50,
  displayTimeFormat = 'YYYY年MM月DD日',
  rangeTimeFormat = 'YYYY-MM-DD'
) {
  let now = moment() // 当前日期
  let result: any[] = []
  const oneDayTime = 24 * 3600 // 一天的秒数 注意不是毫秒数
  let currentUnix = now.unix() // 当前unix时间戳

  const getTimeRange = (begin, end) => {
    return [begin.format(rangeTimeFormat), end.format(rangeTimeFormat)]
  }
  const getDisplayTime = (begin, end) => {
    return begin.format(displayTimeFormat) + '-' + end.format(displayTimeFormat)
  }

  if (step === 'day') {
    for (let k = 1; k <= num; k++) {
      const obj: any = {}
      const day = moment.unix(currentUnix)
      obj.timeRange = getTimeRange(day, day)
      obj.tooltip = getDisplayTime(day, day)
      result.push(obj)
      currentUnix -= oneDayTime
    }
  }
  if (step === 'week') {
    // 处理当前这周
    const lastWeek: any = {}
    const firstDay = moment(now).weekday(0)
    lastWeek.timeRange = getTimeRange(firstDay, now)
    lastWeek.tooltip = getDisplayTime(firstDay, now)
    currentUnix = firstDay.unix()
    result.push(lastWeek)
    // 处理剩余n-1周
    for (let k = 2; k <= num; k++) {
      const obj: any = {}
      const sunday = moment.unix(currentUnix - oneDayTime) // 当前周-时间戳减去一天 等于上周日时间戳
      const monday = moment(moment.unix(currentUnix - oneDayTime).weekday(0))
      obj.timeRange = getTimeRange(monday, sunday)
      obj.tooltip = getDisplayTime(monday, sunday)
      result.push(obj)
      currentUnix -= oneDayTime * 7
    }
  }
  if (step === 'month') {
    // 处理当前月
    const lastMonth: any = {}
    const firstDate = moment(now).date(1)
    lastMonth.timeRange = getTimeRange(firstDate, now)
    lastMonth.tooltip = getDisplayTime(firstDate, now)
    currentUnix = firstDate.unix()
    result.push(lastMonth)
    // 处理剩余n-1个月
    for (let k = 2; k <= num; k++) {
      const obj: any = {}
      const dayLast = moment.unix(currentUnix - oneDayTime) // 当前月第一天时间戳减去一天 等于上个月最后一天时间戳
      const n = dayLast.date()
      const day1 = moment(moment.unix(currentUnix - oneDayTime).date(1))
      obj.timeRange = getTimeRange(day1, dayLast)
      obj.tooltip = getDisplayTime(day1, dayLast)
      result.push(obj)
      currentUnix -= oneDayTime * n
    }
  }
  return result
}

测试一下

const day = getRangeTimeList('day')
const week = getRangeTimeList('week')
const month = getRangeTimeList('month')
console.log('🚀 ~ day', day)
console.log('🚀 ~ week', week)
console.log('🚀 ~ month', month)

得到
day

week

month

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值