日期时间范围方法

2023-11-02

需求:当前日期或指定日期所在的整年、整季度、整月;当前日期或指定日期所在的上一年、上个季度、上个月。

注:这里的整月不是固定的30天,是根据下个月的第一天倒推的,年份季度同理

最简单的获取当前日期或指定日期整月

/* eslint-disable eqeqeq */
// 获取当前月份的第一天、最后一天
export function getMonthDate(params) {
  const date = params ? new Date(params) : new Date();
  const getYear = date.getFullYear(); // 当前年
  const getMonth = date.getMonth(); // 当前月
  const firstDay = new Date(getYear, getMonth, 1); // 当前月份的第一天

  let nextMonth = getMonth + 1; // 下一个月
  let nextYear = getYear; // 下一年
  if (nextMonth > 12) {
    nextMonth -= 12;
    nextYear += 1;
  }
  const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
  const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
  return [firstDay, lastDay];
}



// 获取当前年份的第一天、最后一天
export function getYearDate(params) {
  const date = params ? new Date(params) : new Date();
  const getYear = date.getFullYear(); // 当前年
  const firstDay = new Date(getYear, 0, 1); // 当前年份的第一天
  const nextDay = new Date(getYear + 1, 0, 1); // 获取下一年的第一天
  const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
  return [firstDay, lastDay];
}

上面的方法都是一个一个单独的,而且如果年、季度、月都要的话,好多的重复代码,所以我又给搞了一个整合版本,哈,只需要传入对应需要获取的日期类型就可以了


/***** 获取当前日期所在的日期范围,整月、整季度、 整年,整半年
 ****** 传入参数:  date,type
 ****** 参数说明:
 ****** ******* date  需要获取的时间日期,默认当前日期
 ****** ******* type  month 月份
 ****** *******       quarter 季度
 ****** *******       half 半年
 ****** *******       year 年份   默认
 *****/
export function getDateRange(date, type) {
  const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
  const range = type || 'year'; // 重置范围类型
  const newYear = newDate.getFullYear(); // 获取传入日期年份 或者 当前年份
  const newMonth = newDate.getMonth(); // 获取传入月份 或者 当前月份
  let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
  let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)

  // 整月   // 季度   // 半年
  if (range !== 'year') {
    let arr = [];
    if (range === 'month') arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    if (range === 'quarter')
      arr = [
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8],
        [9, 10, 11],
      ];
    if (range === 'half')
      arr = [
        [0, 1, 2, 3, 4, 5],
        [6, 7, 8, 9, 10, 11],
      ];
    arr.forEach(item => {
      if (range === 'month' ? item === newMonth : item.indexOf(newMonth) > -1) {
        let nextMonth =
          range === 'month'
            ? item + 1
            : range === 'quarter'
            ? item[2] + 1
            : item[item.length - 1] + 1; // 下个月
        let firstMonth = range === 'month' ? item : item[0]; // 当前月/当前时间范围首月
        let nextYear = newYear; // 下一年
        if (nextMonth > 12) {
          // 判断是否是下一年
          nextMonth -= 12;
          nextYear += 1;
        }
        const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
        lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
        firstDay = new Date(newYear, firstMonth, 1); // 当前日期范围第一天
      }
    });
  }

  // 整年
  if (range === 'year') {
    const nextDay = new Date(newYear + 1, 0, 1); // 获取下一年的第一天
    lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
    firstDay = new Date(newYear, 0, 1); // 当前年份的第一天
  }

  return [firstDay, lastDay]; // 最终返回的时间范围
}

/*****
 ***** 从当前日期开始倒推 一月、一季度、半年、一年
 ***** 参数:date,type
 ****** 参数说明:
 ****** ******* date  需要获取的时间日期,默认当前日期
 ****** ******* type  month 月份
 ****** *******       quarter 季度
 ****** *******       half 半年
 ****** *******       year 年份   默认
 */
export function getDateLastRange(date, type) {
  const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
  const range = type || 'year'; // 重置范围类型
  const newYear = newDate.getFullYear(); // 获取年
  const newMonth = newDate.getMonth(); // 获取月
  const newDay = newDate.getDate(); // 获取日

  // console.log(newDate, newDay);

  let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
  let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)

  // 整月   // 季度   // 半年
  if (range !== 'year') {
    let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
    arr.forEach(item => {
      if (item === newMonth) {
        let last =
          range === 'month'
            ? item - 1
            : range === 'quarter'
            ? item - 3
            : range === 'quarter'
            ? item - 6
            : item; // 上个月
        let lastYear = last > -1 ? newYear : newYear - 1; // 上一年
        const lastMonth = last > -1 ? arr[last] : arr[arr.length + last];

        firstDay = new Date(lastYear, lastMonth, newDay); // 当前日期范围第一天
        lastDay = new Date(new Date().getTime() - 1000 * 60 * 60 * 24); // 获取当前日期范围的最后一天
      }
    });
  }

  // 整年
  if (range === 'year') {
    lastDay = newDate; // 今天
    firstDay = new Date(newYear - 1, newMonth, newDay); // 上一年的今天
  }

  return [firstDay, lastDay]; // 最终返回的时间范围
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日期时间范围方法 的相关文章

  • 如何在 Lambda 中将对象上传到 S3?

    似乎无法将对象上传到 Lambda 中的 S3 本地一切正常 日志中没有错误可以显示出了什么问题 代码如下 console log Loading function var AWS require aws sdk var s3 new AW
  • 为什么 Jshint 在此 if 语句中说“变量已定义”?

    我有这个代码 if something is true var someVar true else var someVar false JsHint 表示在 else 语句部分 someVar 已被定义 这是为什么 我该如何解决 Thank
  • Javascript“this”在 IE 中丢失上下文

    以下在 firefox safari chrome 中工作正常 在 IE 中 this 似乎在 handleEvent 函数中丢失上下文 警报的结果是 object Window 这不是我想要的 当从handleEvent 输出时 this
  • 续集打字稿多对多关系模型数据

    我正在使用sequelize续集打字稿 https github com RobinBuschmann sequelize typescript图书馆 并试图实现以下关系 Team ts Scopes withPlayers include
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • “React”在定义之前就被使用了

    我正在使用 create react app typescript eslint 应用程序 在构建过程中出现这样的错误 Line 1 8 React was used before it was defined typescript esl
  • 如何强制 tsc 忽略 node_modules 文件夹?

    我正在使用 tsc 构建任务 不幸的是 我总是从节点模块文件夹中收到相同的错误 Executing task node modules bin tsc cmd watch p tsconfig json lt node modules ty
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • jquery 中可点击 div 中的按钮

    我有整个 div 您可以单击它来切换该 div 的主要部分 问题是我在该 div 中也有可点击的按钮 当我点击它时 它会执行它应该做的事情 但同时也会切换整个 div 我怎样才能禁用它 Use event stopPropagation 单
  • 使用 JavaScript 防止网页导航离开

    如何使用 JavaScript 防止网页导航离开 Using onunload允许您显示消息 但不会中断导航 因为为时已晚 然而 使用onbeforeunload将中断导航 window onbeforeunload function re
  • 让 Jest 全局设置和全局拆卸在 TypeScript 项目中工作

    我想运行一个在运行测试之前打开数据库连接的函数 全局设置 以及另一个在运行测试后关闭数据库连接的函数 全局拆卸 目前我有以下配置 包 json jest testEnvironment node globalSetup src jest g
  • Javascript等待/异步执行顺序

    所以我试图把我的头脑集中在 Promise await async 上 我不明白为什么当 go 执行时 带有 finished 的警报会紧随 console log coffee 之后 当所有函数都使用等待 承诺时 为什么它只等待 getC
  • 什么时候可以使用Javascript,什么时候不可以?

    不使用太多 javascript jquery 是个好习惯吗 我们应该尽可能避免它 为了良好的可访问性 吗 什么时候可以使用 JavaScript 什么时候不能在网页设计和开发中使用 JavaScript 在什么场景 什么条件下 Updat
  • 如果 jquery 验证激活,如何在单选按钮中放置红色边框[重复]

    这个问题在这里已经有答案了 我的问题是 如果 jquery 验证像示例图片中那样激活 我无法使单选按钮具有红色边框 任何人都可以帮我解决这个问题吗 http i38 photobucket com albums e149 eloginko
  • 根据文本内容从 jquery 对象中过滤元素

    我正在尝试使用contains带有 this 关键字 但它给出了错误 JS function var check ul find li filter function return this contains two css color r
  • ‘state’未定义 no-undef

    我使用教程来学习 React 但我很快就陷入困境 在教程中 他们使用以下代码 import React Component from react class Counter extends Component state count 0 r
  • highchart堆积柱每个类别的总数据

    我想获取每个类别的总数据 这point stackTotal只给出活动数据的总数 从我粘贴的代码示例中 我想知道每种水果的总消耗量 因此 即使我单击右上角图例上的乔的名字 这使得堆叠图表上的所有乔信息都处于非活动状态 我仍然可以知道约翰 简
  • javascript:完全删除top.location.hash?

    如果我的地址栏中已经有一个哈希值 例如domain com whatever 我打电话 top location hash wathever 被转换为domain com 没有任何内容 是否可以完全删除哈希值 所以没有 left 因为如果我
  • VS Code 扩展 - 获取完整路径

    我正在为 VS Code 编写一个插件 我需要知道调用扩展的文件的路径 无论是从编辑器上下文菜单或资源管理器上下文菜单调用还是用户只需键入扩展命令 function activate context get full path of the
  • Safari 扩展将消息发送到特定选项卡

    有没有办法从全局页面发送消息到特定选项卡 我目前正在做的是 在创建选项卡时 注入的脚本会创建一个唯一的 ID 并将包含该编号的消息发送到全局页面 并且全局页面会保存该编号 如果全局页面需要发送一些数据到一个tab 即 tab 3 然后全局页

随机推荐