当前位置: 首页 > news >正文

web实现日历、阳历农历之间相互转换、npm、push、unshift、includes、innerHTML

文章目录

  • 1、原生web实现
    • 效果图
    • html
    • JavaScript
    • style
  • vue2实现
    • html
    • JavaScript


1、原生web实现

效果图

日历


html

<div class="box"><div class="week"><div>星期日</div><div>星期一</div><div>星期二</div><div>星期三</div><div>星期四</div><div>星期五</div><div>星期六</div></div><div class="calendar_box"><div id="idBox" class="calendar"></div></div><div class="y_m_box"><div id="idYBtn" class="y_btn_box"></div><div id="idMBtn" class="m_btn_box"></div><div id="idShow" class="show_box"></div></div>
</div>

JavaScript

// 定义全局变量
let y = undefined,m = undefined;// 创建日期
function creationDate(y, m, d) {let arr = [];for (let i = 1; i < d + 1; i++) arr.push(calendar.solar2lunar(y, m, i));return arr;
}// 收集创建日期需要的数据(重要函数)
function createCalendar(y, m) {let y1 = y,y2 = y,y3 = y,m1 = m - 1,m2 = m,m3 = m + 1,d1 = 0,d2 = 0,d3 = 0,moth = [1, 3, 5, 7, 8, 10, 12],days = () => y % 2 === 0 ? 29 : 28,dayss = (val) => moth.includes(val) ? 31 : 30;if (m === 1) (y1 = y - 1, m1 = 12);if (m === 12) (y3 = y + 1, m3 = 1);d1 = m1 === 2 ? days() : dayss(m1);d2 = m2 === 2 ? days() : dayss(m2);d3 = m3 === 2 ? days() : dayss(m3);let arr1 = creationDate(y1, m1, d1),arr2 = creationDate(y2, m2, d2),arr3 = creationDate(y3, m3, d3),len2 = arr2.length,nWeek1 = arr2[0].nWeek,nWeek3 = arr2[len2 - 1].nWeek;nWeek1 = nWeek1 === 7 ? 0 : arr2[0].nWeek;nWeek3 = nWeek3 === 6 ? 0 : nWeek3 === 7 ? nWeek3 - 1 : 6 - nWeek3;for (let i = arr1.length - 1; nWeek1 > 0; i--) {let item = arr1[i];item.$b = 'different';arr2.unshift(item);nWeek1--;}for (let i = 0; i < nWeek3; i++) {let item = arr3[i];item.$b = 'different';arr2.push(item);}arr2 = arr2.map(item => {item.$SF = item.IDayCn === '初一' && !item.festival ? item.IMonthCn : item.festival ? item.festival : item.IDayCn;return item;});return arr2;
}// 页面渲染
function pageRendering(arr) {let str = '';for (let i = 0; i < arr.length; i++) {let item = arr[i];str += `<div class="item" style="background-color: ${item.$b ? 'rgba(255, 165, 0, .1);' : ''}"><div class="south">${item.cDay}</div><div class="lunar" style="color: ${item.festival ? '#0000ff' : ''}">${item.$SF}</div></div>`;}idBox.innerHTML = str;
}// 初始化
function init() {let date = new Date();y = date.getFullYear();m = date.getMonth() + 1;let arr = createCalendar(y, m);pageRendering(arr);let idYBtnStr = '',idMBtnStr = '';for (let i = 2003; i < 2030; i++) idYBtnStr += `<div class="y_item">${i}</div>`;for (let i = 0; i < 12; i++) idMBtnStr += `<div class="m_item">${i + 1}</div>`;idYBtn.innerHTML = idYBtnStr;idMBtn.innerHTML = idMBtnStr;idShow.innerHTML = `<span>${y}</span> <span>${m}</span>`;
}// 执行初始化
init();// 选择年份
idYBtn.onclick = ({ target: { textContent, className } }) => {y = Number(textContent);assignment(className);
}// 选择月份
idMBtn.onclick = function ({ target: { textContent, className } }) {m = Number(textContent);assignment(className);
}// 年份/月份赋值
function assignment(className) {if (className === 'm_item' || className === 'y_item') {idShow.innerHTML = `<span>${y}</span> <span>${m}</span>`;let arr = createCalendar(y, m);pageRendering(arr);}
}

npm插件下载指令

npm install js-calendar-converter --save

cnpm install js-calendar-converter --S

注释

1、在全局定义变量y和变量m,两个变量分别用来存储当前选中的年份和月份,初始值为undefined
2、定义名为createCalendar函数,createCalendar函数是本例最重要的函数。在createCalendar函数中会创建当前月的上月和下月所有日期数据,并且会组合成日历的形式返回准确数据,也就是把数据组成7天的形式返回。本月前部分不够那就用上月末的日期数据补上,后半部分不够就用下月初的日期数据补上,总之会组成3542个长度的数组数据。
第一步
定义3个保存年份值的变量,为什么要定义三个呢?有可能你会想,那年份不都一样吗!可惜年份不一定一样。当传入的月份是1时,年份就要倒退1年,并且取上一年的12月份做值;当传入月份是12时,年份就要加1,也就是来年的1月份值。
第二步
月份也需要定义3个变量保存值,当传入的值为7时,第1个变量保存6,第2个变量保存7,第3个变量保存8
第三步
同时日期也定义3个变量,不过这3个变量不是存储真正的日期值,而是存储当前月的最大日期值,比如当前月有28天,那就存28,如果是30天,那就存30,共有四种情况,分别是28293031,这些数据用来创建当月的完整日期值。
第四步
定义moth月份数组,数组中存放112月,每个月都是31天的月份序号。
第五步
定义days箭头函数判定2月份,因为2月有平年与闰年之分,需要通过特定的手段处理。
第六步
定义dayss箭头函数判定30天和31天的月份,结合第四步的moth数组来判定。
第七步
处理当前月为112时的年份值和上月值或下月值。
第八步
根据月份获取当月最大天数,首先判断是否是2月。
第九步
到上面的第八步时,相邻3个月的年份、月份和月份最大天数都已经准备好,接下来便是获取对应月份的所有天数值了。
定义名为creationDate的函数用来创建当月天数。函数参数分别是ymdy表示年份,m表示月份,d表示循环结束条件。这一步需要npm插件辅助,这个插件可以实现阳历和农历之间的相互转换。
第十步
经过第九步之后,我们便拿到了相邻3个月的所有日期值,里面包括阳历、农历和星期等相关值,把3个月的日期值分别存到3个变量中待用。
第十一步
处理星期显示的数据,掐头去尾。定义len2保存当前月的日期长度,获取当前月的日期数组第一项和最后一项星期值,并保存到两个变量中。
第十二步
nWeek1 === 7 ? 0 : arr2[0].nWeek当星期等于7时不需要从上个月获取数据补充,否则需要获取上个月对应的数据补齐一个星期,即需要让数据从星期日开始补齐,当星期值为7时说明当前月的1号正好是星期日。
nWeek3 === 6 ? 0 : nWeek3 === 7 ? nWeek3 - 1 : 6 - nWeek3当前月结束时需要补齐的数据值,如果当前月最后1天正好是星期六,那么不需要截取下个月的数据补齐一个星期;如果当前月最后一天是星期日,那么需要从下个月取6天来补全当前月数据;如果是其他星期值,那么就需要使用6减去当前星期值。这一步可能会有点晦涩难懂,希望我的注解能帮到你。
第十三步
第十二步拿到掐头去尾的准确值,那么开始实现掐头去尾的工作吧!掐头会比较麻烦一点,因为需要从数组的末尾开始截取数据,所以i的初始值是数组长度减1,并且i做减减操作,退出循环条件是第十二步中获取的nWeek1值,循环退出条件是nWeek1---1,但不包括-1,使用unshift向数组前面添加数据。去尾简单一点,直接循环加加就好,退出循环的条件是i < nWeek3,这里使用push向数组末尾添加数据。填充头部和尾部数据时给数据新增了一个属性$b用来判别当前月或上月下月的数据,以此来给日期数据显示不同的颜色。
最后一步
循环拼接组合好的数据设置农历月份和对应节日值。至此日历数据模板已创建完成,把最终数据返回即可。
3、关于其他函数不做解析,基本都是渲染相关操作啦!
4、html不做解释,自行阅读即可。
5、style不做解释,自行阅读即可。


style

body {width: 100vw;height: 100vh;display: flex;justify-content: center;align-items: center;margin: 0;
}.box {display: flex;flex-direction: column;justify-content: center;
}.item {background-color: rgba(255, 165, 0, .1);padding: 2px 0;border-radius: 3px;
}.south {font-size: 18px;font-weight: 700;
}.lunar {font-size: 16px;
}.week {display: grid;grid-template-columns: 60px 60px 60px 60px 60px 60px 60px;text-align: center;grid-column-gap: 10px;font-weight: 800;
}.calendar_box {margin-top: 6px;
}.calendar {display: grid;grid-template-columns: 60px 60px 60px 60px 60px 60px 60px;text-align: center;grid-row-gap: 30px;grid-column-gap: 10px;
}.y_m_box {position: fixed;left: 50%;top: 10px;transform: translate(-50%, 0);display: flex;flex-direction: column;align-items: center;
}.y_btn_box {display: grid;grid-template-columns: 68px 68px 68px 68px 68px 68px 68px 68px 68px;grid-column-gap: 20px;grid-row-gap: 20px;
}.m_btn_box {width: 600px;margin-top: 26px;display: flex;justify-content: space-between;
}.y_item,
.m_item {text-align: center;background-color: rgba(0, 0, 255, .3);cursor: pointer;font-weight: 700;border-radius: 4px;padding: 2px 0;box-sizing: border-box;
}.y_item {font-size: 16px;
}.m_item {width: 36px;font-size: 18px;
}.show_box {margin-top: 10px;font-size: 30px;font-weight: 900;
}

vue2实现

html


JavaScript

相关文章:

web实现日历、阳历农历之间相互转换、npm、push、unshift、includes、innerHTML

文章目录 1、原生web实现效果图htmlJavaScriptstyle vue2实现htmlJavaScript 1、原生web实现 效果图 html <div class"box"><div class"week"><div>星期日</div><div>星期一</div><div>星期二</div><…...

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…...

面试官:MySQL自增主键一定是连续的吗?

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错的…...

2023ACP世界大赛教育者论坛:让职业教育直面AI机遇与挑战

“AI技术的普及对创意行业和教育带来的影响和变革-2023 Adobe Certified Professional教育者论坛”在苏州西交利物浦大学成功举办。 本次论坛&#xff0c;由Adobe Certified Professional 世界大赛中国赛区组委会主办&#xff0c;联动了来自院校、海内外杰出的创意公司及国际知…...

Unity基础 音频组件以及音频播放

在游戏开发中&#xff0c;声音是一个重要的环节。Unity中的声音组件可以帮助开发者轻松地控制游戏中音频的播放、音量、循环等属性&#xff0c;从而实现更好的游戏体验。本文将详细介绍Unity声音组件的相关概念和技术&#xff0c;以及其在游戏、影视等领域的广泛应用和发展前景…...

SAP-MM-采购申请审批那些事!

1、ME55不能审批删除行项目的PR 采购申请审批可以设置行项目审批或抬头审批。如果设置为抬头审批时&#xff0c;ME55集中审批时&#xff0c;就会发现有些采购申请时不能审批的&#xff0c; 那么这些采购申请时真的不需要审批么&#xff1f;不是的&#xff0c;经过核对这些采购申…...

专业解读财务共享实现财务数智化转型的有效路径

近年来&#xff0c;随着数字经济的飞速发展&#xff0c;各大企业全面开启数智化转型之路&#xff0c;作为企业数智化转型的重要内容&#xff0c;财务数智化转型始于财务共享服务。然而&#xff0c;财务共享建设并不是一蹴而就的&#xff0c;如何通过财务共享实现财务数智化转型…...

九章云极DataCanvas公司诚邀您共享AI基础软件前沿技术盛宴

“杭州通用人工智能论坛暨AIIA人工智能产业发展大会”将于2023年5月30日-31日在杭州举办。本次人工智能产业发展大会由中国信息通信研究院、中国人工智能产业发展联盟主办&#xff0c;杭州城西科创大走廊管委会、杭州市经济和信息化局、杭州未来科技城管理委员会、人工智能关键…...

【高级语言程序设计(一)】第 10 章:文件

目录 一、文件概述 &#xff08;1&#xff09;文件定义 &#xff08;2&#xff09;文件命名 &#xff08;3&#xff09;文件分类 ① 按照文件的内容划分 ② 按照文件的组织形式划分 ③ 按照文件的存储形式划分 ④ 按照文件的存储介质划分 &#xff08;4&#xff09;文…...

Android 宿主启动插件中的Activity和Service

在宿主App中加载插件App中的四大组件&#xff0c;需要以下几个步骤&#xff1a; 1. 预先在宿主的AndroidManifest文件中声明插件中的四大组件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.co…...

00后卷王自述,我真的很卷吗?

前段时间我去面试了一个软件测试公司&#xff0c;成功拿到了offer&#xff0c;薪资也从10k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟有些工作了3到4年的可能还没有我的高。 在公司一段时间后大家都说我是卷王&#xff0c;其…...

真题详解(树的结点)-软件设计(八十四)

真题详解&#xff08;汇总&#xff09;-软件设计&#xff08;八十三)https://blog.csdn.net/ke1ying/article/details/130856130?spm1001.2014.3001.5501 COCOMOII估算不包括_____。 对象点 B.功能点 C.用例数 D.源代码行 答案&#xff1a;C 语法翻译是一种&#xff…...

LDA算法实现鸢尾花数据集降维

目录 1. 作者介绍2. LDA降维算法2.1 基本概念2.2 算法流程 3. LDA算法实现3.1 数据集介绍3.2 代码实现3.3 结果展示 1. 作者介绍 唐杰&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…...

深入理解Linux虚拟内存管理

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核&#xff08;一&#xff09; 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xf…...

自动化测试框架、Python面向对象以及POM设计模型简介

目录 1 自动化测试框架概述 2 自动化测试框架需要的环境 3 自动化测试框架设计思想&#xff1a;Python面向对象 4 自动化测试框架设计思想&#xff1a;POM&#xff08;Page Object Model&#xff09;页面对象模型 1 自动化测试框架概述 所谓的框架其实就是一个解决问题…...

【CSSpart4--盒子模型】

CSSpart4--盒子模型 网页布局的三大核心&#xff1a;盒子模型&#xff0c;浮动&#xff0c;定位网页布局的过程&#xff08;本质&#xff09;&#xff1a;盒子模型的组成四部分&#xff1a;边框&#xff0c;内容&#xff0c;内边距&#xff0c;外边距 一 、盒子边框border:1.1 …...

Linux - Java 8 入门安装与重装教程集锦

一、入门初始安装 1. 具体安装教程 1. linux 系统中如何安装java环境&#xff08;通过tar.gz文件&#xff09; 安装包下载链接 Java 的 tar.gz 安装包下载链接传送门 Linux 系统的 Java 环境变量配置教程 1. linux查看java版本&#xff0c;以及配置java home 2. Linux环…...

2023年最新企业网盘排行榜出炉

随着云计算技术的不断发展&#xff0c;企业日常工作中大量的资料、文档等信息需要实现集中管理&#xff0c;此时企业网盘工具就应运而生。企业网盘是一种可用于企业内部管理、团队协作及文件共享的云存储平台&#xff0c;能够极大提高企业办公效率和安全性。 一、企业网盘的帮助…...

C++内存分类

内存分配方式(内存布局)&#xff1a; 内存5分类 堆、栈、自由存储区、全局/静态存储区、常量存储区 &#xff08;1&#xff09;栈&#xff1a;内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数&#xff0c;函数调用后返回的地址。&#xff08;为运行函数而…...

不是说00后已经躺平了吗,怎么还是这么卷.....

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...