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

news2024/10/6 14:27:42

文章目录

  • 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--) {
		arr2.unshift(arr1[i]);
		nWeek1--;
	}
	
	for (let i = 0; i < nWeek3; i++) arr2.push(arr3[i]);
	
	return arr2;
}

// 初始化
function init() {
	let date = new Date();
	
	y = date.getFullYear();
	m = date.getMonth() + 1;
	
	let arr = createCalendar(y, m)
		str = '';
	
	for (let i = 0; i < arr.length; i++) {
		let item = arr[i],
			lunar = '';
		
		lunar = item.IDayCn === '初一' && !item.festival ? item.IMonthCn : item.festival ? item.festival : item.IDayCn;
		
		str += `<div class="item">
			<div class="south">${item.cDay}</div>
			<div class="lunar" style="color: ${item.festival ? '#0000ff' : ''}">${lunar}</div>
			</div>`;
	}
	
	idBox.innerHTML = str;
	
	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(y, className);
}

// 选择月份
idMBtn.onclick = function ({ target: { textContent, className } }) {
	m = Number(textContent);
	assignment(m, className);
}

// 赋值
function assignment(val, className) {
	if (className === 'm_item' || className === 'y_item') {
		idShow.innerHTML = `<span>${y}</span> <span>${m}</span>`;
		createCalendar(y, m);
	}
}

npm插件下载指令

npm install js-calendar-converter --save

cnpm install js-calendar-converter --S

注释

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js--》建模软件如何加载外部3D模型?

目录 三维建模软件的介绍 Blender官方文档介绍 Blender软件安装 GLTF格式简介 gltf不同文件形式 看过我之前讲解的three文章的人都知道&#xff0c;我在创建模型的时候都没有使用three.js自带的一些简单模型&#xff0c;而是引入外部的模型并加载到页面上&#xff0c;简言…

数据库基础——1.数据库概述

从这篇文章我们开始学习数据库的相关知识 目录 1.为什么要使用数据库 2.数据库与数据库管理系统 2.1相关概念 2.2数据库与数据库管理系统的关系 ​编辑2.3常见的数据库管理系统 2.4常见的数据库介绍 3.MySQL介绍 3.1概述 3.2关于MySQL8.0 3.3 Oracle vs MySQL 4.RD…

Java 反序列化漏洞

反序列化漏洞是指程序在反序列化期间&#xff0c;通过特殊的调用链引发的一系列安全问题。编程语言中只要存在序列化&#xff0c;反序列化功能就可能存在反序列化的安全问题。这里只针对Java和PHP进行讨论。 序列化漏洞概述 序列化的存在主要是为了存储和传输&#xff0c;将这…

Redis入门篇-初

结束时长 Redis十大数据类型 基本目录 实际的类型是没有被红框框选的10个类型 Strings 1 Lists 2 Sets 3 Hashes 4 Sorted sets 5 Streams 6 Geospatial 7 HyperLogLog 8 Bitmaps 9 Bitfields 10类型展示 Strings --> HelloRedis Lists [A>B>C>C] Sets {A<…

第七章 文件读写

内容框图 7.1 文件读写介绍 文件打开和关闭 用word编写一份简历&#xff0c;应该有哪些流程&#xff1f; 打开word软件&#xff0c;新建一个word文件写入个人简历信息保存文件关闭word软件 同样&#xff0c;编程中操作文件的整体过程类似。 打开文件&#xff0c;或者新建立一个…

chatgpt赋能python:Python中的%z格式化代码

Python中的%z格式化代码 在Python编程中&#xff0c;%z是一个非常有用的格式化代码。它用于表示时区偏移量&#xff0c;并将其与日期时间字符串一起显示。在本文中&#xff0c;我们将深入了解Python中的%z代码&#xff0c;并探讨它如何帮助您处理日期和时间。 什么是%z&#…

chatgpt赋能python:PythonTCP断开连接原因和解决方案

Python TCP 断开连接原因和解决方案 Python 是一种广泛使用的编程语言&#xff0c;它支持网络编程、数据处理、人工智能、机器学习等诸多领域。在网络编程中&#xff0c;Python 通常使用 TCP 连接传输数据。然而&#xff0c;在使用 TCP 连接传输数据的过程中&#xff0c;我们可…

koa2获取HTTP请求参数

HTTP 什么是HTTP HTTP&#xff0c;即超文本传输协议&#xff0c;是一种实现客户端和服务器之间通信的响应协议&#xff0c;它是用作客户端和服务器之间的请求。 客户端&#xff08;浏览器&#xff09;会向服务器提交HTTP请求&#xff1b;然后服务器向客户端返回响应&#xf…

2023 Q1 ZK报告

1. ZK数据 2023年4月4日&#xff0c;ZK社区举办了zkSummit 9。 ZK技术应用场景主要分布情况为&#xff1a; 其中&#xff1a; 1&#xff09;ZK用于隐私场景案例最多&#xff0c;占比12.9%&#xff0c;说明人们对 将ZK技术用于隐私保护 兴趣浓厚。2&#xff09;ZK用于扩容场景…

超长溢出头部省略打点,坑这么大,技巧这么多?

目录 需求 利用 direction 实现头部超长溢出打点 简单介绍一下 direction&#xff1a; 另外两个与排版相关的属性还有&#xff1a; direction: rtl 会导致使用下划线 _ 连接的数字内容排版错误 多方案解决 方案一&#xff1a;两次 direction 反转 当然&#xff0c;这里…

【高级语言程序设计(一)】第 8 章:结构体类型和自定义类型

目录 前言 一、结构体类型定义 &#xff08;1&#xff09;结构体类型定义的一般形式 &#xff08;2&#xff09;结构体类型定义的说明 二、结构体类型变量 &#xff08;1&#xff09;结构体类型变量的定义和初始化 ① 先定义结构体类型、后定义结构体类型的变量&#xf…

今天用AI创作助手写的文章--Docker提问系列介绍 Docker 的基本概念和优势

目录 介绍 Docker 的基本概念和优势&#xff0c;以及在应用程序开发中的实际应用。基本概念&#xff1a;优势&#xff1a; 哪些应用可以部署到docker里面Docker在服务器里面的安装步骤Docker里面的报错如何很仔细的排查解决&#xff1f;总结一下docker 未来发展趋势 介绍 Docke…

安装Arch Linux后要做的十件事

Arch Linux 是一款轻量级、灵活且高度可定制的Linux发行版&#xff0c;被广泛用于个人电脑和服务器。一旦您成功安装了Arch Linux&#xff0c;接下来有一些重要的任务需要完成&#xff0c;以确保系统的稳定性和安全性&#xff0c;并为您的需求做好准备。 本文将详细介绍安装Ar…

C++11 -- 可变参数模板

文章目录 可变参数模板的概念可变模板参数的定义获取可变模板参数包的值递归函数方式展开参数包获取逗号表达式展开参数包获取 STL容器中的emplace相关接口参数emplace_back与STL容器中的push_back的主要区别emplace_back与push_back的差异原理emplate_back与push_back的区别验…

图像算法工程师岗位的主要职责(合集)

图像算法工程师岗位的主要职责 一、确定岗位的职责 1.根据工作任务的需要确立工作岗位名称及其数量; 2.根据岗位工种确定岗位职务范围; 3.根据工种性质确定岗位使用的设备、工具、工作质量和效率; 4.明确岗位环境和确定岗位任职资格; 5.确定各个岗位之间的相互关系; 6.根据岗位…

css元素的显示和隐藏

1. display显示隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…

测试C#分词工具jieba.NET

jieba.NET是jieba中文分词的C#版本&#xff0c;后者是优秀的Python中文分词组件GitHub中得到超过3万星。jieba.NET支持中文分词、关键词提取、词性标注等功能&#xff0c;本文主要测试其中文分词的功能基本用法。   新建测试项目&#xff0c;在NuGet管理器中添加jieba.NET。 …

SpringBoot --- 运维篇

一、打包与运行 1.1、程序打包与运行&#xff08;Windows版&#xff09; 所谓打包指将程序转换成一个可执行的文件&#xff0c;所谓运行指不依赖开发环境执行打包产生的文件。 SpringBoot程序是基于Maven创建的&#xff0c;在Maven中提供有打包的指令&#xff0c;叫做packag…

虹科HiveMQ与MQTT:构建互联汽车的新架构

前言 随着汽车的互联程度越来越高&#xff0c;汽车制造商和互联汽车平台提供商通过使用物联网技术&#xff0c;提供新服务并从车辆收集有价值的遥测数据&#xff0c;以此来增加营收。从高效的车队管理和汽车共享到预测性维护和高级驾驶员辅助系统&#xff0c;未来移动出行的可…

Packet Tracer – 访问控制列表演示

Packet Tracer – 访问控制列表演示 拓扑图 目标 第 1 部分&#xff1a;验证本地连接和测试访问控制列表 第 2 部分&#xff1a;删除访问控制列表和重复测试 背景信息 在本练习中&#xff0c;您将观察如何使用访问控制列表 (ACL) 阻止 ping 访问远程网络上的主机。 从配置…