时间处理获取交易日(考虑兼容性问题)

在获取交易日时间的处理上,出现了苹果14不兼容的问题,就这个问题记录下。 

一、获取交易日的代码

封装了一个js文件,在untils目录下,先看代码,然后我讲下思路。

// 获取节假日数据
import { getCalendarHolidays } from "@/apis/transactionCalendar/index";

export class HolidayChecker {
  constructor() {
    this.holidays = [];
  }

  async init(year) {
    return new Promise(async (resolve, reject) => {
      try {
        const data = [];
        await getCalendarHolidays({ year }).then((res) => {
          data.push(...res.data);
        }); 
        // 如果data为空不执行map
        if (data.length === 0) {
          return;
        }
        this.holidays = data.map((holiday) => ({
           start: new Date(holiday.startDate + "T00:00:00"),
           end: new Date(holiday.endDate + "T23:59:59"),
        }));
        resolve(this);
      } catch (error) {
        reject("Failed to load holiday data:", error);
      }
    });
  }

  // 检查指定日期是否是假期
  isHoliday(date) {
    console.log(
      "===========================  this.holidays: ",
      this.holidays.toString()
    );
    return this.holidays.some((holiday) => {
      console.log("wangc -------------- data:", date.toString());
      console.log("wangc -------------- holiday:", holiday.start.toString());
      console.log(
        "wangc -------------- date >= holiday.start:",
        date >= holiday.start
      );
      return date >= holiday.start && date <= holiday.end;
    });
  }

  // 获取小于等于当前日期的最近一个交易日
  getRecentTradingDay(date) {
    // 判断date的数据类型
    if (!(date instanceof Date)) {
      throw new Error("Invalid date format");
    }
    while (this.isWeekend(date) || this.isHoliday(date)) {
      date.setDate(date.getDate() - 1); // 向前推一天
    }
    return date;
  }

  // 检查是否是周末
  isWeekend(date) {
    const dayOfWeek = date.getDay();
    return dayOfWeek === 0 || dayOfWeek === 6; // 周日为0,周六为6
  }
}

二、调用这个类 

在需要的地方将文件引入进来,并调用

import { HolidayChecker } from "@/utils/HolidayChecker";
onMounted(async () => {
  try {
    const holidayChecker = new HolidayChecker();
    await holidayChecker.init(2024).then((res) => {
      timeSelected.value = res.getRecentTradingDay(
        //获取昨天的时间
        new Date(Date.now() - 86400000)
      );
    });
  } catch (error) {
    timeSelected.value = new Date(Date.now() - 86400000);
  }
});

以上是代码,下面说思路。 

 三、实现思路

 我大致讲下这个文件的思路,创建了这个类,然后最开始去调接口,拿到后端返回的今年的所有节假日数组,返回的时间格式是这样:

这里是将返回的数组处理下时间格式,待会用来比较时间。

 this.holidays = data.map((holiday) => ({
          // start: new Date(holiday.startDate + "T00:00:00"),
          // end: new Date(holiday.endDate + "T23:59:59"),
          start: new Date(holiday.startDate + " 00:00:00"),
          end: new Date(holiday.endDate + " 24:00:00"),
        }));

 处理好的时间格式是这样:

然后判断是不是交易日主要是这段代码:

 // 获取小于等于当前日期的最近一个交易日
  getRecentTradingDay(date) {
    // 判断date的数据类型
    if (!(date instanceof Date)) {
      throw new Error("Invalid date format");
    }
    while (this.isWeekend(date) || this.isHoliday(date)) {
      date.setDate(date.getDate() - 1); // 向前推一天
    }
    return date;
  }

 他会先去判断下类型正确与否,然后去判断是不是假期,如果是周末或节假日就向前推一天,如果不是就返回那天。

因为我获取的是除当天外最近一个交易日,所以要排除掉今天,那如果今天是周一,最近又没有节假日,那么返回的那天就是上周五。

问题就出现在了判断节假日的比较:

 // 检查指定日期是否是假期
  isHoliday(date) {
    console.log(
      "===========================  this.holidays: ",
      this.holidays.toString()
    );
    return this.holidays.some((holiday) => {
      console.log("wangc -------------- data:", date.toString());
      console.log("wangc -------------- holiday:", holiday.start.toString());
      console.log(
        "wangc -------------- date >= holiday.start:",
        date >= holiday.start
      );
      return date >= holiday.start && date <= holiday.end;
    });
  }

 当我这样处理时间时,

isHoliday函数在pc端控制台打印到的数据是这样的,

 在苹果14上打印到的数据是这样的:

可以看到是因为数据转化不正确,那就是说14的数据需要标准的格式,才能转化正确,更改+T然后拼接时间,在手机端打印到的数据就是正确的了,就不放图了。

    this.holidays = data.map((holiday) => ({
          start: new Date(holiday.startDate + "T00:00:00"),
          end: new Date(holiday.endDate + "T23:59:59"),
          // start: new Date(holiday.startDate + " 00:00:00"),
          // end: new Date(holiday.endDate + " 24:00:00"),
        }));

举证:

参考:

 

 综上所述,在考虑各端兼容的话,还是要按照标准的标准执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# 常用刀具钢材介绍

常用刀具钢材介绍 文章目录 常用刀具钢材介绍1、M390 钢材详细介绍1.1、关键特性1.2、应用 2、 VG10 钢材详细介绍2.1、关键特性2.2、应用 3、N690 钢材详细介绍3.1、关键特性3.2、应用 4、D2, D53, 和 7Cr13MoV 钢材对比4.1、D2 钢材4.2、D53 钢材4.3、7Cr13MoV 钢材4.4、对比…

奇怪的bug

奇怪的bug 合集 1.不可见字符集问题 起因是在自己做小项目的时候&#xff0c;通过lombok的data注解&#xff0c;默认生成实体类的get set方法 但是在某个方法中获取一个属性值的时候显示找不到该属性值的get方法&#xff0c;具体直接贴图 我以为是lombok的配置问题&#xff0c…

opencv--使用opencv实现旋转角度的模板匹配

下面的例子是简单的使用opencv 实现的模板匹配流程&#xff0c;其中时间性能和精确度还需要调整&#xff0c;如果直接使用会出问题&#xff0c;所以这个只是例子&#xff0c;根据代码原理可以实现尺度变化的模板匹配和旋转尺度变化同时&#xff0c;具体根据实现的旋转代码进一步…

手持式凝血分析仪条码二维码高效读取解决方案

在医疗行业中&#xff0c;凝血分析仪是一种关键设备&#xff0c;主要用于快速、准确地检测血液凝固功能&#xff0c;同时不需要复杂的样品制备&#xff0c;并且可以在几分钟内获得患者的凝血功能信息&#xff0c;对疾病的诊断和治疗具有重要意义。医疗技术和科技的飞速发展&…

三篇卫星切换的论文

目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…

揭秘:义乌理阳的跨境选品师项目

在全球经济一体化的今天&#xff0c;跨境电商已成为各国贸易的重要组成部分&#xff0c;而选品师作为其中的关键角色&#xff0c;扮演着挑选优质商品的重要角色。在中国义乌&#xff0c;一家名为理阳信息咨询服务有限公司备受关注&#xff0c;因其据称拥有跨境选品师项目而备受…

Qt-Advanced-Docking-System的学习

Qt5.12实现Visual Studio 2019 拖拽式Dock面板-Qt-Advanced-Docking-System_c_saide6000-GitCode 开源社区 (csdn.net) 我使用的是Qt5.5.0 开始&#xff0c;我下载的是最新版的源码&#xff1a;4.1版本 但是&#xff0c;打开ads.pro工程文件&#xff0c;无法编译成功。 然后…

从深度嵌套的JSON结构中提取值

问题背景 在某些情况下&#xff0c;我们可能需要从深度嵌套的JSON结构中提取值。例如&#xff0c;给定以下JSON结构&#xff1a; {"foo_code": 404,"foo_rbody": {"query": {"info": {"acme_no": "444444","…

【云原生】Kubernetes----Helm包管理器

目录 引言 一、Helm概述 1.Helm价值概述 2.Helm的基本概念 3.Helm名词介绍 二、安装Helm 1.下载二进制包 2.部署Helm环境 3.添加补全信息 三、使用Helm部署服务 1.创建chart 2.查看文件信息 3.安装chart 4.卸载chart 5.自定义chart服务部署 6.版本升级 7.版本…

如何舒适的使用VScode

安装好VScode后通常会很不好用&#xff0c;以下配置可以让你的VScode变得好用许多。 VScode的配置流程 1、设置VScode中文2、下载C/C拓展&#xff0c;使代码可以跳转3、更改编码格式4、设置滚轮缩放5、设置字体6、设置保存自动改变格式7、vscode设置快捷代码 1、设置VScode中文…

UE4/UE5像素流送云推流|程序不稳定、弱网画面糊怎么办?

看到不少反馈说像素流送技术在实际的应用中&#xff0c;存在一些问题&#xff0c;比如程序崩溃、画面模糊等。本文将探讨这些问题&#xff0c;并介绍点量云流软件提供了哪些有效的解决方案。 常见的像素流送技术问题 画面质量问题&#xff1a; 当快速操作UE模型或初次启动像素…

关闭windows11的Defender病毒防护

windows11自带的Defender病毒防护并不是每个人都需要&#xff0c;有些人需要关掉它。网上一搜&#xff0c;出现的都在说在安全中心关闭&#xff0c;但这样关闭后依旧随时都在防护着&#xff0c;有些小软件一运行就会给删掉。 以下的方法也是在网上搜索的&#xff0c;但行之有效…

创建节约机关怎样向媒体投稿报道宣传?

创建节约机关并向媒体投稿报道宣传是一项重要的工作&#xff0c;它不仅能够提升机关的形象&#xff0c;还能促进社会各界对节约型社会的认识和支持。 作为一名新晋信息宣传员,初入职场的我满腔热血,怀揣着用文字传递价值的理想,却在投稿的道路上屡遭波折。面对每月的宣传任务,我…

Seal^_^【送书活动第6期】——《Docker快速入门》

Seal^_^【送书活动第6期】——《Docker快速入门》 一、参与方式二、本期推荐图书2.1 作者荐语2.2 编辑推荐2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 从Docker Desktop入手&#xff0c;快速掌握容器技术&#xff01;&#xff01;&#xff01;&#xff01; 一、参与方式 1、…

如何用Vue3打造一个交互式3D产品展示

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Vue.js 的交互式产品卡片组件 应用场景 该代码组件旨在为电子商务网站和在线商店创建交互式且信息丰富的产品卡片。它提供了一种展示产品信息、价格和购买选项的现代且引人注目的方式。 基本功能 该组…

python3的基本语法说明一

一. 简介 本文开始学习 python3 的基本语法。 二. python3的基本语法 1. 编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*- 上述…

vxeTable怎么导出excel文件

文章目录 一、代码示例二、调用导出事件参数详解下载引用 三、过滤某列数据导出 一、代码示例 <vxe-buttonclick"exportDataEvent"circleicon"vxe-icon-download">导出</vxe-button><vxe-tableborderroundstripeheight"auto"ref&…

AIGC绘画设计提示词篇:七大风格、直接可套用的MJ关键词模版

七大风格、直接可套用的MJ关键词模版 1、 具象描述基本结构&#xff08;词与词之间用英文逗号隔开&#xff09; 关键词框架1&#xff1a;主题/主体描述环境描述风格设定构图镜头设计图像属性&#xff08;渲染、质量、尺寸&#xff09; 关键词框架2&#xff1a;参考图主题/主体…

【CS.PL】Lua 编程之道: 控制结构 - 进度24%

3 初级阶段 —— 控制结构 文章目录 3 初级阶段 —— 控制结构3.1 条件语句&#xff1a;if、else、elseif3.2 循环语句&#xff1a;for、while、repeat-until3.2.1 输出所有的命令行参数3.2.2 while.lua3.2.3 repeat.lua及其作用域 &#x1f525;3.2.4 for.lua (For Statement)…

【网络编程】地址族与数据序列

IP是Internet Protocol简写&#xff0c;是为了收发网络数据而分配给计算机的值&#xff0c;端口号是为区分程序中创建的套接字而分配给套接字的序号。 网络地址分为两类&#xff1a;IPv4(4个字节地址族)&#xff0c;IPv6(6个字节地址族) 网络地址初始化&#xff0c;主要针对服…