js制作柱状图的x轴时间, 分别展示 月/周/日 的数据

2023-09-20 16:52:05

背景

有个需求是要做一个柱状图, x 轴是时间, y 轴是数量. 其中 x 轴的时间有三种查看方式: 月份/周/日, 也就是分别查看从当前日期开始倒推的最近每月/每周/每日的数量.

本篇文章主要是用来制作三种不同的 x 轴

从当前月开始倒推月份

注意 getMonth() 函数可以获取当前月份, 但是范围是 0-11, 0代表1月

let xArr = []; // 用来存放周的数组(x轴的坐标)
let xNum = 4; // x轴展示

// 获取当前时间
let today = new Date();

// 格式化x轴坐标
const XMonthFormat = (year,month) => {
    return year+"-"+("0"+month).substr(-2)
}

// 月份的返回值范围是 0~11,0是一月
const createXMonth = (today) => {
    let currentMonth = today.getMonth()

    for(let i = xNum - 1;i>=0;i--) {
        let targetMonth = currentMonth - i;

        if (targetMonth < 0) {
            targetMonth = 12 + targetMonth;
        }

        let targetYear = today.getFullYear();
        if (targetMonth > currentMonth) {
            targetYear--;
        }
        xArr.push(XMonthFormat(targetYear, targetMonth + 1))
    }
}

createXMonth(today)

结果:
在这里插入图片描述

从当前日开始倒推

为了避免不同日期不同, 所以采用了getTime() 这种方式

let xArr = []; // 用来存放周的数组(x轴的坐标)
let xNum = 4; // x轴展示

// 获取当前时间
let today = new Date();

// 格式化x轴坐标
const XDayFormat = (day) => {
    let dayStr = day.toISOString().substring(0, 10)
    return dayStr
}

// 获取前一天的日期
const oneDaysAgo = (curDate) => new Date(curDate.getTime() - 1 * 24 * 60 * 60 * 1000)

const createXDay = (curDay) => {
    xArr.push(XDayFormat(curDay))
    if(xArr.length < xNum) {
        createXDay(oneDaysAgo(curDay))
    }
}
createXDay(today)

结果:
在这里插入图片描述

从当前周开始倒推

比起月/日, 周是较为复杂的. 思路是: 首先获取本周的起始时间(周一和周日), 然后分别获取周一和周日七天前的日期(也就是上一周的起止日期), 根据要展示的 x 轴的坐标数量进行递归

首先先看两个小的 deomo

js获取本周起止时间

// 获取当前时间
var today = new Date();

// 获取本周的第一天(星期日)
var firstDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay() + 1));

// 获取本周的最后一天(星期六)
var lastDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay() + 7));

// 转换成指定格式
var firstDayOfWeekStr = firstDayOfWeek.toISOString().substring(0, 10);
var lastDayOfWeekStr = lastDayOfWeek.toISOString().substring(0, 10);

console.log('本周起始日期:', firstDayOfWeekStr);
console.log('本周结束日期:', lastDayOfWeekStr);

结果为:
在这里插入图片描述

如果不截取字符串的话, 得到的结果是第一行这样的:
在这里插入图片描述

这个代码使用了 JavaScript 内置对象 Date 来获取当前时间,然后根据当前时间计算出本周的起始日期和结束日期。具体步骤如下:

  • 使用 setDate() 方法将当前日期减去星期几的天数,得到本周的第一天(按中文习惯设置为星期一)。
  • 使用 setDate() 方法再次对当前日期进行操作,将日期减去星期几的天数,然后加上 6,得到本周的最后一天(按中文习惯设置为星期日)。
    最后,使用 toISOString() 方法将日期转换为 ISO 格式的字符串,并截取前 10 个字符,即年月日部分。

请注意,这个代码获取的时间均为本地时间,如果需要使用 UTC 时间,可以使用 getUTC*() 方法来获取 UTC 时间的相关值。

js获取7天前起止时间

// 获取当前时间
var today = new Date();

// 获取7天前的时间
var sevenDaysAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);

// 转换成指定格式
var todayStr = today.toISOString().substring(0, 10);
var sevenDaysAgoStr = sevenDaysAgo.toISOString().substring(0, 10);

console.log('今天:', todayStr);
console.log('7天前:', sevenDaysAgoStr);

这个代码使用了 JavaScript 内置对象 Date 来获取当前时间,然后根据当前时间计算出 7 天前的时间。最后,使用 toISOString() 方法将时间转换为 ISO 格式的字符串,并截取前 10 个字符,即年月日部分。

请注意,这个代码获取的时间均为本地时间,如果需要使用 UTC 时间,可以使用 getUTC*() 方法来获取 UTC 时间的相关值。

let xArr = []; // 用来存放周的数组(x轴的坐标)
let xNum = 4; // x轴展示

// 获取当前时间
let today = new Date();

// 格式化x轴坐标
const Xformat = (start,end) => {
    let startStr = start.toISOString().substring(0, 10)
    let endStr = end.toISOString().substring(0, 10)
    return startStr+"至"+endStr
}

// 获取每个周一的7天前的时间,也就是上个周一
const sevenDaysAgo = (curDate) => new Date(curDate.getTime() - 7 * 24 * 60 * 60 * 1000)

// 获取本周的第一天(星期一)
let curMonday = new Date(today.setDate(today.getDate() - today.getDay() + 1));

// 获取本周的最后一天(星期日)
let curSunday = new Date(today.setDate(today.getDate() - today.getDay() + 7));

const createXWeek = (curMon,curSun) => {
    xArr.push(Xformat(curMon,curSun))
    if(xArr.length < xNum) {
        createX(sevenDaysAgo(curMon),sevenDaysAgo(curSun))
    }
}

createXWeek(curMonday,curSunday)

console.log('xArr:', xArr);

结果:
在这里插入图片描述

根据两个demo整合得到的代码

// 格式化x轴坐标
const XWeekFormat = (start,end) => {
    let startStr = start.toISOString().substring(0, 10)
    let endStr = end.toISOString().substring(0, 10)
    return startStr+"至"+endStr
}

// 获取每个周一的7天前的时间,也就是上个周一
const sevenDaysAgo = (curDate) => new Date(curDate.getTime() - 7 * 24 * 60 * 60 * 1000)

// 获取本周的第一天(星期一)
let curMonday = new Date(today.setDate(today.getDate() - today.getDay() + 1));

// 获取本周的最后一天(星期日)
let curSunday = new Date(today.setDate(today.getDate() - today.getDay() + 7));

const createXWeek = (curMon,curSun) => {
    xArr.push(XWeekFormat(curMon,curSun))
    if(xArr.length < xNum) {
        createX(sevenDaysAgo(curMon),sevenDaysAgo(curSun))
    }
}

createXWeek(curMonday,curSunday)

三个一起的最终js

let xArr = []; // 用来存放周的数组(x轴的坐标)
let xNum = 4; // x轴展示

// 获取当前时间
let today = new Date();

// --------------------- 每月 --------------------

// 格式化x轴坐标
const XMonthFormat = (year,month) => {
    return year+"-"+("0"+month).substr(-2)
}

// 月份的返回值范围是 0~11,0是一月
const createXMonth = (today) => {
    let currentMonth = today.getMonth()

    for(let i = xNum - 1;i>=0;i--) {
        let targetMonth = currentMonth - i;

        if (targetMonth < 0) {
            targetMonth = 12 + targetMonth;
        }

        let targetYear = today.getFullYear();
        if (targetMonth > currentMonth) {
            targetYear--;
        }
        xArr.push(XMonthFormat(targetYear, targetMonth + 1))
    }
}

createXMonth(today)

// ------------------------------------------

// --------------------- 每日 --------------------

// 格式化x轴坐标
const XDayFormat = (day) => {
    let dayStr = day.toISOString().substring(0, 10)
    return dayStr
}

// 获取前一天的日期
const oneDaysAgo = (curDate) => new Date(curDate.getTime() - 1 * 24 * 60 * 60 * 1000)

const createXDay = (curDay) => {
    xArr.push(XDayFormat(curDay))
    if(xArr.length < xNum) {
        createXDay(oneDaysAgo(curDay))
    }
}
// createXDay(today)
// ------------------------------------------

// --------------------- 每周 --------------------

// 格式化x轴坐标
const XWeekFormat = (start,end) => {
    let startStr = start.toISOString().substring(0, 10)
    let endStr = end.toISOString().substring(0, 10)
    return startStr+"至"+endStr
}

// 获取每个周一的7天前的时间,也就是上个周一
const sevenDaysAgo = (curDate) => new Date(curDate.getTime() - 7 * 24 * 60 * 60 * 1000)

// 获取本周的第一天(星期一)
let curMonday = new Date(today.setDate(today.getDate() - today.getDay() + 1));

// 获取本周的最后一天(星期日)
let curSunday = new Date(today.setDate(today.getDate() - today.getDay() + 7));

const createXWeek = (curMon,curSun) => {
    xArr.push(XWeekFormat(curMon,curSun))
    if(xArr.length < xNum) {
        createX(sevenDaysAgo(curMon),sevenDaysAgo(curSun))
    }
}

// createXWeek(curMonday,curSunday)

// ---------------------------------------------

console.log('xArr:', xArr);

更多推荐

SpringSecurity 权限管理的实现

文章目录前言权限管理的实现权限校验的原理FilterSecurityInterceptorAccessDescisionManagerAffirmativeBasedConsensusBasedUnanimousBasedAccessDecisionVoterWebExpressionVoterAuthenticate

响应式网页设计(Responsive Web Design)的核心原理

聚沙成塔·每天进步一点点⭐专栏简介⭐响应式网页设计的核心原理⭐优点和缺点优点缺点⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个

国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结

目录1、国产化系统概述1.1、国产化操作系统与国产化CPU1.2、国产化服务器操作系统1.3、当前国产化系统的主流配置2、视频解码花屏与卡顿问题2.1、视频解码花屏2.2、视频解码卡顿2.3、关于I帧和P帧的说明3、国产显卡处理速度慢导致图像卡顿问题3.1、视频延时和卡顿原因分析3.2、SDL2库跑在景嘉微国产显卡上效

亚马逊、敦煌网、国际站自养号测评需要哪些资源与技术门槛?

测评服务商说的天花乱坠,实际真假难辨,FB等社交软件自找测评犹如大海捞针。产品都要上架了,靠谱的测评服务还是没找到,亚马逊测评求人不如求己,今天来教你怎么养一批安全、可控的买家号。亚马逊等跨境平台测评自养号需要用到哪些资源呢?1、养号系统及软件2、代理IP资源3、收货地址及注册资料4、外币信用卡及礼品卡5、邮箱及手机号

当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益,可分为供给服务、文化服务、调节服务和支持服务4类,对提升人类福祉具有重大意义,且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目(MillenniumEcosystemAssessment,MA)以来,生态系统服务成为学术界的研究热点,其中在生态系统服务功能

学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集

文章目录1.模数转换器(ADC)是什么?手册说明:2.STC32G单片机ADC使用原理19.1.1ADC控制寄存器(ADC_CONTR)19.1.2ADC配置寄存器(ADCCFG)19.1.4ADC时序控制寄存器(ADCTIM)19.3ADC相关计算公式3.编写最简单的ADC采集代码(查询&中断)P10的引脚去获取一个

4、ARM异常处理

一、异常处理1、异常概念处理器在正常执行程序的过程中可能会遇到一些不正常的的事件发生,这时处理器就要将当前的程序暂停下来转去处理这个异常的事件,异常事件完成后再返回到之前被异常打断的点继续执行2、异常处理机制不同的处理器对异常的处理流程大体相同,但是不同的处理器在具体实现的机制上有所不同。比如处理器遇到哪些事件认为是异

【Flink实战】玩转Flink里面核心的Source Operator实战

🚀作者:“大数据小禅”🚀文章简介:【Flink实战】玩转Flink里面核心的SourceOperator实战🚀欢迎小伙伴们点赞👍、收藏⭐、留言💬目录导航Flink的API层级介绍SourceOperator速览Flink预定义的Source数据源案例实战Flink自定义的Source数据源案例-订单来源实战F

Android UT开发简介

一、概述AndroidUT(UnitTesting)开发是指在Android应用程序中进行单元测试的开发过程。单元测试是一种软件测试方法,用于测试应用程序中的最小可测试单元(通常是函数或方法)的正确性。AndroidUT开发的主要目标是确保应用程序的各个单元在不同情况下能够按照预期正确运行。通过编写、运行和维护单元测试

免费、安全、可靠!一站式构建平台 ABS 介绍及实例演示 | 龙蜥技术

编者按:操作系统是一个大的软件集合,成百上千个软件之间有相互调用、相互依赖等各种复杂的关联关系,所以统一的软件包格式,能够更友好地管理、定义这些复杂关系。今天,龙蜥社区基础设施Contributor单凯伦带大家了解龙蜥社区官方构建平台ABS,熟悉AnolisOS软件包、镜像构建流程以及ABS未来规划等。本文整理自龙蜥大

【Windows 11】安装 Android子系统 和 Linux子系统

本文使用电脑系统:文章目录一、安卓子系统1.1安装WSA1.2使用二、Linux子系统2.1安装WSL以及WSL相关概念2.2安装一个Linux发行版2.21从MicrosoftStore安装2.22用命令安装2.23拓展三、拓展3.1存储位置3.2虚拟化技术3.3Windows虚拟内存3.3wsl帮助文件一、安卓子系

热文推荐