日期推算/日历(小程序)

小程序日历组件(选择区间日期) 小程序日历组件(选择区间日期) .wxml <view class="calendar"> <view class="calendar_header_box"> <view class="cuIcon-back btn btnl {{prevBtn ? '' : 'cannot_edit'}}" bindtap="prevMonth"></view> <view class="time">{{year} 阅读详情

微信小程序项目,遇到这么个需求。效果图如下:

每页显示4个周的日期,可点击日期时间段,也可点击左右箭头图标进行日期翻页,这一块其实就是推算日期,把每个周的起始时间和结束时间推算出来,并正确显示出来就行了。默认(未进行左右翻页)第一个周的起始时间为当前时间即可。

 

var self;
var day = 0;
var page = 0;
var weekArr = [];

Page({

  /**
   * 页面的初始数据
   */
  data: {
    arr: [],
    clickIndex: 0,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    self = this;
    self.getWeekArr(day);
  },

  /**
   * 点击日期
   */

  clickItem(e) {
    self.setData({
      clickIndex: e.currentTarget.dataset.index,
    });
    console.log(e.currentTarget.dataset.week_start + '-' + e.currentTarget.dataset.week_end);
  },

  /**
   * 后退
   */
  left() {
    page--;
    day = page * 28;
    self.getWeekArr(day);
  },

  /**
   * 前进
   */
  right() {
    page++;
    day = page * 28;
    self.getWeekArr(day);
  },


  /**
   * 获取周数据
   */
  getWeekArr(day) {
    weekArr.splice(0, weekArr.length);
    for (var i = 0; i < 4; i++) {
      var week = {
        'week_start': self.getDay(day),
        'week_end': self.getDay(day + 6),
      };
      weekArr.push(week);
      day += 7;
    }
    self.setData({
      arr: weekArr,
      clickIndex: 0,
    });
    console.log(self.data.arr);
    var week = self.data.arr[0];
    console.log(week.week_start + '-' + week.week_end);
  },

/**
 * 计算日期
 */
  getDay(day){
    var date = new Date();
    var milliseconds = date.getTime() + 1000 * 60 * 60 * 24 * day;
    date.setTime(milliseconds);
    var month = date.getMonth() + 1;
    var day = date.getDate();
    return month + "." + day;
  },
})
<view class='container'>
  <image src='../image/zuojiantou.png' class='arrow' bindtap='left'></image>
  <view class='date_container'>
    <view class="item {{clickIndex==index?'active':''}}" wx:for='{{arr}}' wx:key='{{item}}' 
    bindtap='clickItem' data-index='{{index}}' data-week_start='{{item.week_start}}' data-week_end='{{item.week_end}}'>
      {{item.week_start}}-{{item.week_end}}
    </view>
  </view>
  <image src='../image/youjiantou.png' class='arrow' bindtap='right'></image>
</view>
.container {
  display: flex;
  height: 200rpx;
  align-content: center;
  align-items: center;
}

.arrow {
  width: 70rpx;
  height: 70rpx;
}

.date_container {
  flex: 1;
  display: flex;
  align-items: center;
}

.item {
  width: 150rpx;
  height: 150rpx;
  font-size: 26rpx;
  background-color: #f00;
  text-align: center;
  color: white;
  line-height: 150rpx;
  border-radius: 50%;
  margin-left: 10rpx;
}

.active {
  width: 160rpx;
  height: 160rpx;
  background-color: blue;
  line-height: 160rpx;
}

——————————————————————————————————————————————————————————

还有一种是日历效果,效果图如下:

具体样式跟调整css来自定义。这里我是以弹窗的形式展示的。

<button type='primary' bindtap='showCalendar'>展示日历</button>

<view class='mask' hidden='{{show_calendar}}' bindtap='closeCalendar' catchtouchmove='true'>
  <view class='dialog'>
    <view class="calendar">
      <view class="leftBgView" bindtap="handleCalendar" data-handle="prev">
        <image src='../image/arrow_left.png' class='arrow'></image>
      </view>
      <view class="centerView">{{cur_year}} 年 {{cur_month}} 月</view>
      <view class="rightBgView" bindtap="handleCalendar" data-handle="next">
        <image src='../image/arrow_right.png' class='arrow'></image>
      </view>
    </view>

    <view class="weekBgView">
      <view class="weekView" wx:for="{{weeks_ch}}" wx:key="{{index}}">{{item}}</view>
    </view>

    <view class="dateBgView">
      <view class='emptyView' wx:if="{{hasEmptyGrid}}" wx:for="{{empytGrids}}" wx:key="{{index}}"></view>
      <view class="dateView" wx:for="{{days}}" wx:key="{{index}}" data-idx="{{index}}" bindtap="dateSelectAction">
        <view>
          <view class="datesView {{index==todayIndex?'dateSelectView':''}}">{{item.day}}</view>
          <view class='red_point_container'>
            <view wx:if='{{item.haveMeeting}}' class='red_point'></view>
          </view>
        </view>
      </view>
    </view>
  </view>
</view>
.dialog {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background: white;
}

.mask {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.4);
}

.calendar {
  height: 80rpx;
  font-size: 28rpx;
  display: flex;
  align-items: center;
  justify-content: center;
}

.leftBgView {
  width: 80rpx;
  height: 80rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}

.arrow {
  width: 40rpx;
  height: 40rpx;
}

.centerView {
  width: 50%;
  height: 80rpx;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
}

.rightBgView {
  width: 80rpx;
  height: 80rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}

.weekBgView {
  height: 50rpx;
  display: flex;
  align-items: center;
}

.weekView {
  width: 14.2857%;
  text-align: center;
  font-size: 28rpx;
}

.dateBgView {
  display: flex;
  flex-wrap: wrap;
}

.emptyView {
  width: 14.2857%;
}

.dateView {
  width: 14.2857%;
  height: 80rpx;
  display: flex;
  justify-content: center;
}

.datesView {
  height: 56rpx;
  line-height: 56rpx;
  text-align: center;
  font-size: 26rpx;
  display: flex;
  justify-content: center;
}

.dateSelectView {
  width: 56rpx;
  height: 56rpx;
  border-radius: 50%;
  line-height: 56rpx;
  color: white;
  text-align: center;
  background-color: green;
}

.red_point_container {
  width: 100%;
  display: flex;
  justify-content: center;
}

.red_point {
  width: 10rpx;
  height: 10rpx;
  border-radius: 50%;
  background-color: red;
}
var arr = [];
var self;
Page({

  data: {
    hasEmptyGrid: false,
    cur_year: '',
    cur_month: '',
    show_calendar: true,
  },

  onLoad(options) {
    self = this;
    //1、2、25号添加圆点儿标识
    arr.push(1);
    arr.push(2);
    arr.push(25);
    self.setNowDate();
  },

  dateSelectAction(e) {
    var cur_day = e.currentTarget.dataset.idx;
    this.setData({
      todayIndex: cur_day,
      show_calendar: true,
    })
    console.log(`点击的日期:${this.data.cur_year}年${this.data.cur_month}月${cur_day + 1}日`);
  },

  setNowDate() {
    const date = new Date();
    const cur_year = date.getFullYear();
    const cur_month = date.getMonth() + 1;
    const todayIndex = date.getDate() - 1;
    const weeks_ch = ['日', '一', '二', '三', '四', '五', '六'];
    this.calculateEmptyGrids(cur_year, cur_month);
    this.calculateDays(cur_year, cur_month);
    this.setData({
      cur_year: cur_year,
      cur_month: cur_month,
      weeks_ch,
      todayIndex,
    })
  },

  getThisMonthDays(year, month) {
    return new Date(year, month, 0).getDate();
  },

  getFirstDayOfWeek(year, month) {
    return new Date(Date.UTC(year, month - 1, 1)).getDay();
  },

  calculateEmptyGrids(year, month) {
    const firstDayOfWeek = this.getFirstDayOfWeek(year, month);
    let empytGrids = [];
    if (firstDayOfWeek > 0) {
      for (let i = 0; i < firstDayOfWeek; i++) {
        empytGrids.push(i);
      }
      this.setData({
        hasEmptyGrid: true,
        empytGrids
      });
    } else {
      this.setData({
        hasEmptyGrid: false,
        empytGrids: []
      });
    }
  },

  calculateDays(year, month) {
    let days = [];
    const thisMonthDays = this.getThisMonthDays(year, month);
    for (let i = 1; i <= thisMonthDays; i++) {
      days.push({
        day: i,
        haveMeeting: arr.indexOf(i) != -1,
      });
    }
    this.setData({
      days
    });
  },

  handleCalendar(e) {
    const handle = e.currentTarget.dataset.handle;
    const cur_year = this.data.cur_year;
    const cur_month = this.data.cur_month;
    if (handle === 'prev') {
      let newMonth = cur_month - 1;
      let newYear = cur_year;
      if (newMonth < 1) {
        newYear = cur_year - 1;
        newMonth = 12;
      }
      this.calculateDays(newYear, newMonth);
      this.calculateEmptyGrids(newYear, newMonth);
      this.setData({
        cur_year: newYear,
        cur_month: newMonth
      })
    } else {
      let newMonth = cur_month + 1;
      let newYear = cur_year;
      if (newMonth > 12) {
        newYear = cur_year + 1;
        newMonth = 1;
      }
      this.calculateDays(newYear, newMonth);
      this.calculateEmptyGrids(newYear, newMonth);
      this.setData({
        cur_year: newYear,
        cur_month: newMonth
      })
    }
  },

  /**
   * 显示日历
   */
  showCalendar() {
    self.setData({
      show_calendar: false,
    });
  },

  /**
   * 关闭日历
   */
  closeCalendar() {
    self.setData({
      show_calendar: true,
    });
  }
})

 

从零构建日历文件生成器:iCalendar格式与RRULE解析 在数字化协作中,日历文件(.ics)是跨设备分发日程事件的标准载体,它基于iCalendar协议定义事件、提醒和重复规则,让一次生成、多处导入成为可能。对于活动组织者、课程助教等需要批量分发日程的用户,掌握这一格式不仅能简化操作,还能避免手动转发带来的误差。生成合格日历文件的关键在于正确处理时区信息(如TZID与VTIMEZONE)、重复规则(RRULE)以及提醒组件(VALARM),这些细节直接影响导入后时间是否准确、事件是否按预期重复。本文以构建一个跨平台日历生成工具为切入点,梳理从事件建模到导出的完整 阅读详情

相关推荐

微信小程序未来N天可配置预约日历(带星期中文显示)

直接可用的微信小程序日历组件,专注未来指定天数内的日期选择场景,自动显示星期几(如周一、周二),支持灵活设置起始天数和展示天数。组件返回标准日期格式(YYYY-MM-DD)、对应星期中文名、是否为今日等结构化数据,方便快速接入挂号、服务预约、课程排期等业务逻辑。资源包包含完整示例页面(pages/appointment_date)、独立组件源码(components/date)、两版界面效果截图(show.jpg、show1.png)以及清晰的README说明文档,兼容主流小程序基础库版本。配套教程覆盖组件

j0k1l2m3n的博客 206

微信小程序-获取日期并计算星期几

微信小程序中已经封装了一个计算日期的,格式是2018/10/05 14:56:33,在util目录下面的util.js 同样的我们自己封装的计算日期的函数也放在util.js中。 在需要计算日期的页面引入util.js,引入代码如下: var util=require("../../utils/util.js") 功能说明:获取当前时间,并计算当前时间往后推的日期,计算星期几 util...

ChibiMarukoChan的博客 1万+

微信小程序可直接用的日历组件,带农历节气、法定调休识别和日程提醒

专为微信小程序开发的日历插件,开箱即用,无需额外配置。每日期间同步显示公历与农历信息,包括节气、生肖、干支纪年,方便安排传统节日相关事务。自动匹配国家公布的法定节假日及调休安排,通过颜色或图标直观区分放假日与补班日,避免人工维护假期表。支持按日期添加个性化提醒事项,如生日、会议、缴费截止等,可设置提前1天至7天触发弹窗或消息通知。代码结构清晰:components目录封装核心日历组件,pages提供演示页面,calendar.js负责农历转换与假期计算,utils包含常用工具函数,app.和app.wxss

smartcontract5的博客 287

微信小程序 工作时间段选择 星期几选择

1. 效果图如上  需完成时间段的选择  以及下面的工作日选择  保存按钮为formSubmit提交后台2.思路: ①时段用picker跟input  如果没有占位字符  则不需要input             ②工作日选择用checkbox  多选的样式用label  将checkbox隐藏             ③label的选择后的样式跟取消的样式,这里无需判断checked  当然也...

qq_39201210的博客 5876

日期计算程序(java)

是一个java编写的小程序,用于计算某一日到某一日之间共多少天,呵呵,可以用于计算你长这么大,活了多少天,程序很简单,给初学者学习java中关于时间等相关操作一个小启发

Lede(OpenWrt)安装和双宽带叠加

LEDE是一个专为路由器和嵌入式设备设计的自由和开源的操作系统。LEDE是OpenWRT项目的一个分支项目。LEDE操作系统包括许多路由器有用的功能,如网络地址转换、防火墙、端口转发、DHCP服务器等。

我的博客 6441

微信小程序 日历区间选择组件

有项目需求需要一个日历区间的选择器,发现vant 或者其他的日历区间选择组件不是很满足需求,于是自己改造一个;

weixin_38984353的博客 2203

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 434

微信小程序多列选择器实现日期+时间的选择

1.实现效果 2.实现原理 mode='multiSelector'多列选择器 自定义范围数组range 3.实现代码 <!--pages/jsCase/multiTime/index4.wxml--> <view class="act_box"> <view class="act_item flex j_b"> <view class="nowp"><text class="require">*</text>

苏苏就是小苏苏的博客 2623

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 574

【局部规划模块轨迹优化算法】EM_planner最大期望滚动优化算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对EM_planner最大期望滚动优化算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 760

小程序筛选日期、时间、多选以及清空筛选

接上一文章遮罩层模板内的功能实现 日期时间选择器Picker  WXML页面 &lt;block wx:if="{{current=='0'}}"&gt; &lt;view class="limitedAt"&gt; &lt;picker mode="date" value="{{date}}" bindchange="chan

Fang格子的博客 5701

【2025华为OD机考真题】- 简易内存池(B卷-200分)(C版)

🔔本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅

**My Coding Family** 961

微信小程序日历组件:打造移动端高效日期交互解决方案

微信小程序日历组件是一款专为移动端场景设计的高效日期交互工具,通过原生小程序技术构建,提供流畅的滑动体验、灵活的日期标记和智能的禁用控制功能。无论是电商平台的促销日期选择,还是企业应用的项目排期管理,这款组件都能帮助开发者快速实现专业级的日期交互界面,显著提升用户体验和开发效率。 ## 核心价值:重新定义移动端日期交互体验 ### 实现丝滑流畅的月份切换 采用三swiper-item架构设计,

gitblog_00668的博客 288

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

先进封装类别分析与典型案例

当制程微缩逼近物理极限、单颗大芯片(reticle limit)面积受限于光罩尺寸,且逻辑、存储、射频、传感等功能无法用同一套工艺最经济地制造时,性能增益的来源从 "晶体管密度" 转向 "互连密度"。先进封装的本质,是在芯片外部用更短、更密、更宽的路径把多个裸 die(die)互连起来,换取更高带宽、更低延迟、更小体积和异构集成能力。行业通常按划分为 2D、2.5D、3D、扇出、SiP 五大谱系,Chiplet/UCIe 则是贯穿其上的设计方法论,玻璃基板、共封装光学(CPO)是正在成型的新分支。

0 32

计算多少天后的日期

C语言:计算多少天后的日期 有的时候我会想,再过个100天是几月几日呢?也许你可以翻翻日历,但是如果是1000天、10000天以后呢?为什么我们不写个小程序来专门处理这个问题呢?似乎也不是很复杂…… 于是这篇博客应运而生,其实计算的逻辑很简单,就是使用计算机模拟日期计数,比较有特色的地方在于switch-case的“非常规”运用—— / * * 文件名:nextdate.c * 作者:于子豪 * ...

我的blog屋 3607

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4518

Java实现一个日历小程序

package Test; import java.time.DayOfWeek; import java.time.LocalDate; public class CalendarTest { public static void main(String[] args) { LocalDate date =LocalDate.now(); ...

diaoshi7218的博客 250

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c语言推算多少天后日期思路,计算多少天后的日期

C语言:计算多少天后的日期有的时候我会想,再过个100天是几月几日呢?也许你能够翻翻日历,可是若是是1000天、10000天之后呢?为何咱们不写个小程序来专门处理这个问题呢?彷佛也不是很复杂……因而这篇博客应运而生,其实计算的逻辑很简单,就是使用计算机模拟日期计数,比较有特点的地方在于switch-case的“很是规”运用——/ ** 文件名:nextdate.c* 做者:于子豪* 描述:计算多少...

weixin_34736467的博客 2066

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言万年历 查询年历 月历 星期(日期)循环查询(2020 3 19更新)

C语言万年历 很多人都有做过万年历,于是想自己写一个。 万年历是我们日常生活中经常用到的一种非常实用的工具。 由于工作繁忙,人们常常忘记某一天是星期几,想要看看某个月的日历,或者一整年的。我把自己的想法实现如下: 1、任意年份日历的整体输出; 2、任意年任意月日历的单独输出; 3、任意年月日 查询星期几; 4、按任意键 退出; 5、循环查询,直到选择退出; ps: 以上星期几的推算只适合于1582...

songbai220 9912

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Vue日历组件实现农历与节日展示

基于Vue开发的多功能日历组件,支持公农历转换、节日标注及日期选择功能。通过calendar.js实现农历计算,结合自定义样式和交互逻辑,提供良好的用户体验。

weixin_29050829的博客 853

仿写美团酒店日期选择组件(小程序、React-Native)

日期选择 在哪 美团首页 - 酒店住宿 - 日期选择 美团上 美团小程序 & 美团App ...

weixin_33802505的博客 2037

全源码提供-贴心专业的月嫂育儿嫂预约小程序

每年超900万新生儿,月嫂育儿嫂客单价12800-25800元,是服务预约最高客单价赛道。本文介绍基于Vue3的月嫂育儿嫂预约小程序,覆盖客户+月嫂+管理后台三角色,支持档期日历、宝宝信息表单、资质审核、面试签约、6步进度等特色功能。

qwert 245

Excel日期加天数的5类陷阱与4种安全计算法

在电子表格处理中,日期计算是数据准确性的基石。Excel底层将日期存储为序列号,但用户常误将文本型日期、含时间戳值或非法日期直接参与运算,导致#VALUE!错误、跨月溢出或时区偏差。掌握DATE函数的智能进位、WORKDAY的工作日逻辑、EDATE的月份自适应及基础加法的适用边界,是规避财务错账、项目延期与合规风险的关键。尤其在财务付款、临床随访、大促排期等强业务规则场景中,必须区分自然日、工作日与日历月三类时间粒度。本文聚焦Excel日期类型识别、函数选型决策与三层防护体系,助力从业者构建鲁棒的日期计算流

weixin_30896511的博客 405

微信小程序:阳历与农历互转、24节气、闰年

样例小程序二维码,我自己做的一个免费好用的【随机选择决定转盘工具】小程序,欢迎扫码体验呦!1、在utils目录下创建caledar-tools.js。

通往成功之路的一个过客 703
上一篇: flutter状态管理---provider
下一篇: flutter开发常用插件整理
尘彦
博客等级 码龄11年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值