JavaScript 生成日期格式坐标

准备工作

// 在 String.prototype 上添加 _padStart 
String.prototype._padStart = function (maxLen, fillStr) {
    return this.length < maxLen ? this.padStart(maxLen, fillStr) : this.toString()
  }

// 创建工具对象
const utilObj = {
    date: new Date(),
    year () {
      return this.date.getFullYear()
    },
    month () {
      return this.date.getMonth() + 1
    },
    day () {
      return this.date.getDate()
    },
    /* 天数转换成毫秒数 */
    toMs (days) {
      return days * 24 * 60 * 60 * 1000
    },
    /* 日期字符串转换成时间戳 */
    toTimeStamp (dateStr) {
      return new Date(dateStr).getTime()
    },
    /* 上一年 */
    prevYear () {
      let y = this.year()
      y = y - 1
      return [`${y}-01-01`, `${y}-12-31`]
    },
    /* 本年 */
    currentYear () {
      const y = this.year()
      return [`${y}-01-01`, `${y}-${this.month()}-${this.day()}`]
    },
    /* 最近几天 */
    pastDays (days) {
      const end = this.date.getTime()
      const start = end - this.toMs(days - 1)
      return [
        this.format(new Date(start)),
        this.format(new Date(end))
      ]
    },
    /* 格式化日期 */
    format (date, format = 'YYYY-mm-dd') {
      const obj = {
        "YYYY": date.getFullYear().toString(),        // 年
        "mm": (date.getMonth() + 1).toString()._padStart(2, '0'),     // 月
        "dd": date.getDate().toString()._padStart(2, '0'),            // 日
        "HH": date.getHours().toString()._padStart(2, '0'),           // 时
        "MM": date.getMinutes().toString()._padStart(2, '0'),         // 分
        "SS": date.getSeconds().toString()._padStart(2, '0')          // 秒
      };
      for (let k in obj) {
        format = format.replace(k, obj[k])
      };
      return format;
    }
  }

实现 MakeXDataMap 类

class MakeXDataMap {
    constructor () {
      this.xData = []
      // 只有一个参数
      if (arguments.length === 1) {
        if (Array.isArray(arguments[0])) {
          // 直接传入xData
          this.xData = arguments[0]
        } else {
          // 传入日期类型数字
          this.xData = this.getXData(...this.getDateRangeByDateType(arguments[0]))
        }
      }
      // 有两个参数(实例时可以传startDate和endDate)
      if (arguments.length === 2) {
        this.xData = this.getXData(...arguments)
      }
    }

    /**
     * @function 根据日期类型生成开始日期和结束日期组成的数组
     * @param dateType {number} 日期类型
     * @return [startDate: string, endDate: string]
     * */
    getDateRangeByDateType (dateType) {
      switch (dateType) {
        // 上一年
        case 0:
          return utilObj.prevYear()
        // 本年
        case 1:
          return utilObj.currentYear()
        // 近半年
        case 2:
          return utilObj.pastDays(180)
        // 近一季度
        case 3:
          return utilObj.pastDays(90)
        // 近一月
        case 4:
          return utilObj.pastDays(30)
        // 近一周
        case 5:
          return utilObj.pastDays(7)
      }
    }

    /**
     * @function 根据开始日期,结束日期生成横坐标
     * @param startDate {能转成日期对象的字符串或者日期对象}
     * @param endDate {能转成日期对象的字符串或者日期对象}
     * */
    getXData (startDate, endDate) {
      const xData = []
      startDate = new Date(startDate).getTime()
      endDate = new Date(endDate).getTime()
      while (startDate <= endDate) {
        xData.push(utilObj.format(new Date(startDate)))
        // 开始日期加一天
        startDate = startDate + 24 * 60 * 60 * 1000
      }
      return xData
    }

    /**
     * @description 生成横坐标对应的map格式数据,值默认为0。每次都返回一个新的map,这在有一个横坐标,多个纵坐标时很有用
     * */
    getXDataMap () {
      const map = new Map()
      this.xData.forEach(x => {
        map.set(x, 0)
      })
      return map
    }
  }

测试

  /* 最近一周 */
  const obj = new MakeXDataMap(5)
  // 最近一周横坐标数组
  console.log(obj.xData) // ['2022-05-24', '2022-05-25', '2022-05-26', '2022-05-27', '2022-05-28', '2022-05-29', '2022-05-30']

  // 补齐数据
  const map = obj.getXDataMap()
  const data = [
    { date: '2022-05-28', value: '4' },
    { date: '2022-05-30', value: '8' },
  ]
  data.forEach(item => {
    map.set(item.date, item.value)
  })
  const xData = obj.xData // 或者[...map.keys()]
  const yData = [...map.values()]
  console.log(xData) // ['2022-05-24', '2022-05-25', '2022-05-26', '2022-05-27', '2022-05-28', '2022-05-29', '2022-05-30']
  console.log(yData) // [0, 0, 0, 0, '4', 0, '8']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以使用Vue.js和CSS3动画来实现生成动态坐标点并添加动画效果的功能。 首先,你需要在Vue.js中定义一个数组来存储坐标点的位置信息,例如: ```javascript data() { return { points: [ { x: 100, y: 100 }, { x: 200, y: 200 }, { x: 300, y: 300 } ] } } ``` 然后,在Vue的模板中使用v-for指令来循环渲染这些坐标点,并使用CSS3动画效果来让它们动起来,例如: ```html <div class="point" v-for="(point, index) in points" :key="index" :style="{ left: point.x + 'px', top: point.y + 'px' }" :class="{ 'animated': point.animated }"> </div> ``` 这里的.point样式可以自定义,可以设置它的宽度、高度、背景颜色等属性来让它看起来像一个点。 接下来,你可以使用Vue的生命周期钩子函数mounted来触发一个函数,在这个函数中使用JavaScript来为每个坐标点添加一个CSS3动画效果,例如: ```javascript mounted() { this.points.forEach((point, index) => { setTimeout(() => { point.animated = true; }, index * 200); }); } ``` 这个函数会遍历每个坐标点,然后使用setTimeout函数来为每个点添加一个CSS3动画效果,其中index * 200是一个延迟时间,可以让每个点的动画效果有一定的间隔,让它们看起来更加自然。 最后,你可以在CSS中定义一个类.animated,来设置坐标点的动画效果,例如: ```css .point.animated { animation: move 1s ease-out; } @keyframes move { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.2); opacity: 0.8; } 100% { transform: scale(1); opacity: 1; } } ``` 这里的动画效果是一个简单的放大和淡入淡出的效果,你可以自定义它来让它看起来更加炫酷。 总之,使用Vue.js和CSS3动画可以很容易地实现生成动态坐标点并添加动画效果的功能,希望我的回答对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值