微信小程序开发——日历实现

2023-11-02

 

1.new Date().toLocaleDateString(), //获取当前的时间(年月日)

2. new Date().getFullYear()  //获取年

    new Date().getMonth() + 1, //获取月份

    new Date().getDate(), //获取日期

3.this.getThisMonthDays(year, month)  //获取当月天数

4.this.getLastMonthDays(year, month)   //绘制上个月天数

 this.getNowMonthDays(year, month)  //绘制当月天数

 this.getNextMonthDays(year, month)  //绘制下个月

​
<view class="container">
  <view class="calendar-container">
    <!-- 年月的显示 -->
    <view class="calendar-container-header">
      <view class="date-text">{{year}}年{{month}}月</view>
      <view class="btn-box">
        <view class="btn preBtn" bindtap="changeMonth" data-type="pre"></view>
        <view class="btn nextBtn" bindtap="changeMonth" data-type="next"></view>
      </view>
    </view>
    <!-- 日期的显示 -->
    <view class="calendar-container-body">
      <!-- 显示星期 -->
      <view class="calendar-week">
        <view class="calendar-week-item" wx:for="{{weeksArr}}" wx:key="index">{{item}}</view>
      </view>
      <!-- 显示日期 -->
      <view class="calendar-days">
        <!-- 上个月的日期 -->
        <view class="days-item last-days-item {{item.isNowMonthDay}}" wx:for='{{lastMonthDays}}' wx:key='item' bindtap="selectDate" data-time="{{item.time}}" data-type="lastMonthDays" data-index="{{index}}">{{item.date}}</view>

        <!--当月的日期-->
        <view class="days-item {{item.isNowMonthDay}}" wx:for='{{nowMonthDays}}' wx:key='index' bindtap="selectDate" data-item="{{item}}"  data-type="nowMonthDays" data-index="{{index}}">
          {{item.date}}
        </view>

        <!--下个月的日期-->
        <view class="days-item next-days-item {{item.isNowMonthDay}}" wx:for='{{nextMonthDays}}' wx:key='item' bindtap="selectDate" data-item="{{item}}"  data-type="nextMonthDays" data-index="{{index}}">{{item.date}}</view>
      </view>
    </view>
  </view>
</view>

​

.container{
  padding: 32rpx;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.5);
  box-sizing: border-box;
}

/* 日历容器的样式 */
.calendar-container{
   width: 100%;
   /* height: 800rpx; */
   border-radius: 24rpx;
   background-color: #ffffff;
   box-sizing: border-box;
}
/* 日历容器的头部样式 */
.calendar-container .calendar-container-header{
  padding: 24rpx 24rpx 16rpx;
  width: 100%;
  border-bottom: 2rpx solid #cccccc;

  display: flex;
  justify-content: space-between;
  align-items: center;
  
  box-sizing: border-box;
}
 .calendar-container-header .date-text{
  font-weight: 700;
}

/* 切换月份按钮的样式 */
 .calendar-container-header .btn-box {
  width: 130rpx;
  height: 40rpx;
  display: flex;
  justify-content: space-between;
  box-sizing: border-box;
}

 .calendar-container-header .btn-box .btn {
  width: 40rpx;
  height: 40rpx;
  background-size: 100% 100%;
  background-position: center center;
  background-repeat: no-repeat;
  border-radius: 50%;
  background-image: url(https://aalq.oss-cn-hangzhou.aliyuncs.com/basketball/arrow-down.png);
}

 .calendar-container-header .btn-box .btn.preBtn {
  transform: rotate(90deg);
}

.calendar-container-header .btn-box .btn.nextBtn {
  transform: rotate(-90deg);
}

/* 日期的显示样式 */
.calendar-container-body {
  margin-top: 16rpx;
  padding-bottom: 64rpx;
  width: 100%;
  height: 100%;
  box-sizing: border-box;
}

.calendar-container-body .calendar-week {
  display: flex;
  box-sizing: border-box;
}

.calendar-week .calendar-week-item {
  width: calc(686rpx  / 7);
  text-align: center;
  font-size: 32rpx;
  font-weight: 700;
  box-sizing: border-box;
}

/* 日期 */
.calendar-days {
  display: flex;
  flex-wrap: wrap;
  font-size: 28rpx;
  font-weight: 700;
  box-sizing: border-box;
}

.calendar-days .days-item {
  width: calc(686rpx  / 7);
  height: 68rpx;
  text-align: center;
  line-height: 68rpx;
  box-sizing: border-box;
}
.calendar-days .days-item.isNowMonthDay{
  border-radius: 68rpx;
background-color: #28EFD2;
color: #ffffff;
}
.calendar-days .days-item.isNotNowMonthDay{
  border-radius: 68rpx;
  background-color: #cccccc;
  color: #ffffff;
}
.calendar-days .days-item.isActive{
  position: relative;
}
.calendar-days .days-item.isActive::after{
  display: block;
  content: '';
  border:10rpx  solid #28EFD2 ;
  border-top:10rpx  solid transparent ;
  border-left: 10rpx solid transparent;
  position: absolute;
  right: 0;
  bottom: 0;
}
.calendar-days .days-item.last-days-item,
.calendar-days .days-item.next-days-item {
  color: #ccc;
}
Page({
  data: {
    // 本月指的是选择的当前月份
    year: new Date().getFullYear(),
    month: new Date().getMonth() + 1,
    nowMonth: new Date().getMonth() + 1, //本月是几月
    nowDay: new Date().getDate(), //本月当天的日期
    weeksArr: ['日', '一', '二', '三', '四', '五', '六'],
    lastMonthDays: [], //上一个月
    nowMonthDays: [], //本月 
    nextMonthDays: [], //下一个月
    timeDate: new Date().toLocaleDateString(), //当前时间
    lastType: "nowMonthDays", //上一次选中的时间类型,默认为本月
  },
  onShow() {
    let {
      year,
      month
    } = this.data
    this.createDays(year, month)
  },
  //创建时间
  createDays(year, month) {
    this.getLastMonthDays(year, month)
    this.getNowMonthDays(year, month)
    this.getNextMonthDays(year, month)
  },
  //获取当月天数
  getThisMonthDays(year, month) {
    return new Date(year, month, 0).getDate();
  },
  //绘制上个月天数
  getLastMonthDays(year, month) {
    let nowMonthFirstDays = new Date(year, month - 1, 1).getDay()
    let lastMonthDays = []
    if (nowMonthFirstDays) { //判断当月的第一天是不是星期天
      //上个月显示多少天
      let lastMonthNums = month - 1 < 0 ? this.getThisMonthDays(year - 1, 12) : this.getThisMonthDays(year, month - 1); //判断是否会跨年

      //上个月从几号开始显示
      for (let i = lastMonthNums - nowMonthFirstDays + 1; i <= lastMonthNums; i++) {
        let time = new Date(year, month - 2, i).toLocaleDateString() //对应的时间
        lastMonthDays.push({
          date: i, //几号
          week: this.data.weeksArr[new Date(year, month - 2, i).getDay()], //星期几
          time,
          isNowMonthDay: ''
        });
      }
    }
    this.setData({
      lastMonthDays
    })
  },
  //绘制当月天数
  getNowMonthDays(year, month) {
    let {
      nowMonth,
      nowDay
    } = this.data
    let nowMonthDays = []
    let days = this.getThisMonthDays(year, month); //获取当月的天数
    for (let i = 1; i <= days; i++) {
      let time = new Date(year, month - 1, i).toLocaleDateString()
      nowMonthDays.push({
        date: i, //几号
        week: this.data.weeksArr[new Date(year, month - 1, i).getDay()], //星期几
        time,
        isNowMonthDay: (month == nowMonth && i == nowDay) ? "isNowMonthDay" : (i == nowDay) ? "isNotNowMonthDay" : ""
      });
    }
    this.setData({
      nowMonthDays
    })
  },
  //绘制下个月
  getNextMonthDays(year, month) {
    let {
      lastMonthDays,
      nowMonthDays,
    } = this.data
    let nextMonthDays = []
    let nextMonthNums = (lastMonthDays.length + nowMonthDays.length) > 35 ? 42 - (lastMonthDays.length + nowMonthDays.length) : 35 - (lastMonthDays.length + nowMonthDays.length) //下个月显示多少天
    let nowYear = (parseInt(month) + 1) > 12 ? year + 1 : year //下一个月的年份
    let nowMonth = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1 //下一个月的月份
    if (nextMonthNums) { //判断当前天数是否大于零
      for (let i = 1; i <= nextMonthNums; i++) {
        let time = new Date(year, month - 1, i).toLocaleDateString()
        nextMonthDays.push({
          date: i, //几号
          week: this.data.weeksArr[new Date(nowYear, nowMonth - 1, i).getDay()], //星期几
          time,
          isNowMonthDay: ''
        });
      }
    }
    this.setData({
      nextMonthDays
    })
    // console.log(nextMonthDays)
  },
  //切换月份
  changeMonth(e) {
    let {
      year,
      month
    } = this.data
    let type = e.currentTarget.dataset.type //类型
    if (type == 'pre') { //上一个月
      year = month - 1 > 0 ? year : year - 1
      month = month - 1 > 0 ? month - 1 : 12
    } else { //next 下个月
      year = (parseInt(month) + 1) > 12 ? year + 1 : year
      month = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1
    }
    this.setData({
      year,
      month,
      lastType: "nowMonthDays", //切换月份,时间类型默认为本月
    })
    this.createDays(year, month)
  },
  //选择时间
  selectDate(e) {
    let type = e.currentTarget.dataset.type //选择的时间类型
    let index = e.currentTarget.dataset.index //选择的下标
    // console.log("选择的时间",type,index)
    let {
      lastType
    } = this.data
    //将上一次选择的时间类型的 isNowMonthDay 全改为''
    this.data[lastType]?.forEach(item => { 
      item.isNowMonthDay = ''
    })
    this.data[type]?.forEach((item, idx) => {
      if (index == idx) {
        item.isNowMonthDay = (item.time == new Date().toLocaleDateString() ? "isNowMonthDay" : "isNotNowMonthDay"); //判断当前选中的日期是否是当前时间
      } else {
        item.isNowMonthDay = ''
      }
    })
    this.setData({
      [lastType]: this.data[lastType],
      [type]: this.data[type],
      lastType: type
    })
  }
})

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

微信小程序开发——日历实现 的相关文章

  • 二叉树的翻转

    目录 一 题目 二 解题思路 1 二叉树翻转 2 具体步骤 迭代法 三 代码实现 一 题目 1 leetcode链接 力扣 2 题目内容 给你一棵二叉树的根节点 root 翻转这棵二叉树 并返回其根节点 示例 1 输入 root 4 2 7
  • LeetCode No3. 无重复字符的最长子串 题解

    文章目录 一 题目 二 算法思想 三 示例 四 代码 五 复杂度分析 六 算法评价 一 题目 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串

随机推荐

  • 从高中到大学 寻找真实的自己

    写在前面 这是这个寒假刚开始在CSDN上写博客的时候发的第一个blink 当时想说的话有点多 但blink的文字限制是1024字 所以那时控制了字数 现在放开重新写 写在正文 因为疫情原因在家上了差不多3个月的网课 大一回来过个寒假 再次回
  • 2020年研究生数学建模竞赛优秀论文汇总

    A题 ASIC 芯片上的载波恢复 DSP算法设计与实现论文1 论文2 论文3 论文4 论文5 B题 降低汽油精制过程中的辛烷值损失模型论文1 论文2 论文3 论文4 论文5 论文6 论文7 论文8 论文9 论文10 C题 面向康复工程的脑电
  • HTTP协议2)----对于传输层的详细讲解

    大家好 我是 兔7 一位努力学习C 的博主 如果文章知识点有错误的地方 请指正 和大家一起学习 一起进步 如有不懂 可以随时向我提问 我会全力讲解 如果感觉博主的文章还不错的话 希望大家关注 点赞 收藏三连支持一下博主哦 你们的支持是我创作
  • pythonfilter_Python如何用filter函数筛选数据

    一 filter函数简介 filter函数主要用来筛选数据 过滤掉不符合条件的元素 并返回一个迭代器对象 如果要转换为列表list或者元祖tuple 可以使用内置函数list 或者内置函数tuple 来转换 filter函数接收两个参数 第
  • Altium Designer可以实现选中整条同网络线路的快捷键

    选中一段线路 按Tab键 可以选中同网络的整条线路
  • Masked Autoencoders Are Scalable Vision Learners

    Masked Autoencoders Are Scalable Vision Learners Author Unit Facebook AI Research FAIR Authors Kaiming He
  • Finclip小程序目录结构与微信小程序目录结构

    Finclip小程序目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page 一个小程序主体部分由三个文件组成 必须放在项目的根目录 如下 文件 必需 作用 app js 是 小程序逻辑 app json 是 小程序公
  • 两个无序的数组 如何进行合并 为一个有序的数组

    这里我们首先来看 自己也才毕业半年 这些题比较适合新手练练思想 技术之路且行且珍惜 算法绝对是核心竞争力 两个无序的数组 那么首先第一步合并 第二步 使用正则表达式去掉 第三步 split进行划分 第四步 最核心的排序 此处用了Arrays
  • MYSQL索引那些事

    一 关系型和非关系型的区别 以及使用场景 关系型数据库 采用关系模型来组织数据的数据库 关系模型就是二维表格模型 一张二维表的表名就是关系 二维表中的一行就是一条记录 二维表中的一列就是一个字段 优点 容易理解 使用方便 通用的 sql 语
  • Ceph OSD Down

    CEPH集群跑了一段时间后有几个OSD变成down的状态了 但是我用这个命令去activate也不行 ceph deploy osd activate osd1 dev sdb2 dev sdb1 只能把osd从集群中移除 然后再重建了 这
  • 【我的Android进阶之旅】如何快速寻找Android第三方开源库在Jcenter上的最新版本...

    问题描述 解决方法 先了解compile comsquareupokhttpokhttp240的意义 了解Jcenter和Maven jcenter Maven Central 理解jcenter和Maven Central 快速搜索方法1
  • 改造我们的学习

    我们知道 程序员必须得不断的学习 才能跟上日新月异的技术 但是很多朋友陷入了误区 比如学习C 总觉得我要把 C Primier 看完 再开始编程 学习图像处理也是 非要把数字图像处理与Opencv的书籍看完 才开始上机调试 最后云里雾里 感
  • 零基础Qt笔记<传智教育>Qt版本:2022 5.15

    目录 1 创建第一个Qt程序 2 命名规范以及快捷键 3 QPushBottom的创建 4 对象树 5 Qt中的坐标系 6 信号和槽 6 1 实现点击按钮关闭窗口 6 2 自定义的信号和槽 6 3 自定义的信号和槽发生重载的解决 6 4 信
  • 电话号码升位(拷贝构造函数)

    题目描述 定义一个电话号码类CTelNumber 包含1个字符指针数据成员 以及构造 析构 打印及拷贝构造函数 字符指针是用于动态创建一个字符数组 然后保存外来输入的电话号码 构造函数的功能是为对象设置键盘输入的7位电话号码 拷贝构造函数的
  • python编程实战(三):暴力破解WIFI密码!亲测运行有效!

    本文非原创 参考 Python破解WIFI密码详细介绍 对于代码有细微修改 增加注意事项介绍 声明 本文只是从技术的角度来阐述学习Pywifi库 并不建议大家做任何破坏性的操作和任何不当的行为 并不建议大家做任何破坏性的操作和任何不当的行为
  • js分治法入门级教程,二分搜索的解法

    一 分治法定义 在计算机科学中 分治法是一种很重要的算法 字面上的解释是 分而治之 分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即子问题的解的合并 分
  • 将Hugging Face模型转换成LibTorch模型

    Hugging Face的模型 以waifu diffusion模型为例 给出的实现一般是基于diffuser库 示例代码如下 import torch from torch import autocast from diffusers i
  • R手册(Visualise)--geomnet(ggplot2 extensions)

    文章目录 geomnet 返回ggplot2扩展主目录 geomnet Geom 网格图 关系图 geom net aes from id to id fontsize data stat net position identity na
  • 原始NeRF代码学习记录

    本文记录学习 ECCV 2020 的论文 NeRF Representing Scenes as Neural Radiance Fields for View Synthesis 对应的开源 tensorflow 代码 对NeRF的原始论
  • 微信小程序开发——日历实现

    1 new Date toLocaleDateString 获取当前的时间 年月日 2 new Date getFullYear 获取年 new Date getMonth 1 获取月份 new Date getDate 获取日期 3 th