微信小程序中如何计算距离某个节日还有多少天


Posted in Javascript onJuly 15, 2019

先看一下页面效果:

微信小程序中如何计算距离某个节日还有多少天

页面是这样的:

微信小程序中如何计算距离某个节日还有多少天

好了,正文如下

最近碰到个需求需要计算,距离圣诞、元旦、高考、国庆啊等最近一个节日,还剩多少天。

因为后台没空理我,所以本文讲解在js中如何解决这个需求。(建议实际中获取标准时间,当前时间有点不靠谱)

首先肯定是要用 new Date() 获得当前时间对象,然后再用它的一些方法获取当前年月日等,根据年月日判断。

先看一下new Date()对象常用的方法。

getYear(); //获取当前年份(2位)
  getFullYear(); //获取档期年份(4位)
  getMonth(); // 获取当前月份(0-11,0代表1月,很神经,获取日是正常的1-31...)
  getDate(); // 获取当前日(1-31)
  getDay(); //获取当前星期几(0-6,0代表星期天...)
  getTime(); //获取当前时间(从1970.1.1开始的毫秒数),注意,是毫秒数!!!
  getHours(); // 获取当前小时数(0-23)
  getMinutes(); // 获取当前分钟数(0-59)
  getSeconds(); // 获取当前秒数
  getMilliseconds(); //获取当前毫秒数
  toLocalDateString(); // 获取当前日期

一开始,我是先取得Date()对象的月,日,然后判断月份等不等于某个日期的月份。分三种情况...

let mydate = new Date();
  let year = mydate.getFullYear();
  let month = mydate.getMonth();
  let day = mydate.getDate();
  
  // 判断距离下个高考还需要多久
  
  if(month < 6){
    // ...
  }else if(month>6){
    // ...
  }else{
    if(day == 7){
      
    }else{
      
    }
  }

但是转念一想,这个做法太繁琐了。于是换个思路,直接获取目标日期的时间戳和当前日期的时间戳,两者之间进行比较。

代码如下:

// 公共API
 // @params 传入节日日期的str,例如'-10-1','-12-25','-1-1'等
 // @return resolve()回调的是个数组
 // 数组第一个参数返回的是'今'或者'明'这个字符串,第二个参数返回的是还剩多少天
 settime:function(str){
  
  let promis = new Promise((resolve,reject)=>{
   
   // 获取时间对象
   let dateObj = new Date()
   let year = dateObj.getFullYear()
   let month = dateObj.getMonth()
   let day = dateObj.getDate()
   
   // 求当前日期和时间的时间戳
   // 这里需要注意的是,利用new Date().getMonth()得到的是0-11的数值
   // 而用new Date('year-month-day')初始化求今天0点0分0秒时的Month
   // 需要传入的是1-12的,也就是month要+1

   let now = new Date() 
   let target = new Date(year + str)  // 目标日期
   
   // 先保存起来,后续还会用
   let nowtime = now.getTime()    // 当前日期时间戳
   let sjc = nowtime - target.getTime() // 时间差

    // 回调的2个参数,会组成数组传入回调函数中
   // 这2个信息会直接赋值显示到页面中
   let theyear = '今'
   let thedays = 0

   if (sjc < 0) {

    // 还未过今年某个节日
    theyear = '今'
    thedays = Math.floor(Math.abs(sjc / (24 * 60 * 60 * 1000)))

   } else if (sjc > 0) {

    // 已经过了今年某个节日
    let mn = year - 0 + 1
    let mntarget = new Date(mn + str)
    let sjc2 = mntarget.getTime() - nowtime
    theyear = '明'
    thedays = Math.floor(sjc2 / (24 * 60 * 60 * 1000))

   } else {
    // 一年的节日期间
    theyear = '今'
    thedays = 0
   }
   let arr = [theyear, thedays]
   resolve(arr)
  })

  return promis
 }

我页面的wxml是这样的

<view>
 距离<text>{{gk_year}}</text>年高考还剩:<text>{{gk_days}}</text>天
</view>
<view>
距离<text>{{gq_year}}</text>年国庆还剩:<text>{{gq_days}}</text>天
</view>
<view>
距离<text>{{yd_year}}</text>年元旦还剩:<text>{{yd_days}}</text>天
</view>
<view>
距离<text>{{sd_year}}</text>年圣诞还剩:<text>{{sd_days}}</text>天
</view>

在页面中这样调用:

/**
  * 生命周期函数--监听页面初次渲染完成
  */
 onReady: function () {
  // 设置距离xx还剩多少天
  this.setgk() // 高考
  this.setgq() // 国庆
  this.setyd() // 元旦
  this.setsd() // 圣诞
 },

 /**
  * 求距离高考还剩多少天
  */
 setgk:function(){
  let promis = this.settime('-06-07')
  let that = this

  promis.then((arr)=>{
   that.setData({
    gk_year:arr[0],
    gk_days:arr[1]
   })
  })
 },

 // 设置国庆信息
 setgq:function(){
  let promis = this.settime('-10-01')
  let that = this

  promis.then((arr) => {
   that.setData({
    gq_year: arr[0],
    gq_days: arr[1]
   })
  })
 },

 // 设置元旦
 setyd:function(){
  let promis = this.settime('-01-01')
  let that = this

  promis.then((arr) => {
   that.setData({
    yd_year: arr[0],
    yd_days: arr[1]
   })
  })
 },
 // 设置圣诞
 setsd: function () {
  let promis = this.settime('-12-25')
  let that = this

  promis.then((arr) => {
   that.setData({
    sd_year: arr[0],
    sd_days: arr[1]
   })
  })
 },

附注:调用的时候要人为的补全日期,也就是不足10要在前面补个0,这部分代码在开发工具上就算不补全也是可以用的。但是在iphone 6s ios12下,不补全,就无效。不知道这个是不是bug,其他手机没测试,不清楚不补全是否可用。建议用的时候还是人为补全日期吧。

小结,编程就是这样,很多时候我们换个思路,得出来的思路会比之前的好很多。所以,就算当前项目很紧,做完了之后,还是要多多思考。将一些当时很别扭的地方多想一下,没准就能想出更好的解决思路。

这一点无论是对个人还是项目,都是有益的。

10-24更新备注:取当前日期的时间戳计算天数存在bug,有1天的差异。所以将settime:function()  中获取当前日期的时间戳,改成了获取当前时间的时间戳,因为后续是用Math.floor()函数向下取整,能够解决时间点带来的时间戳差异的问题。
最后看一下效果(第一张图片上的字和第二张最底部的灰色字体,2018-10-24更新)

微信小程序中如何计算距离某个节日还有多少天

微信小程序中如何计算距离某个节日还有多少天

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript 页面模板化很多人没有使用过的方法
Jun 05 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 Javascript
javascript实现tab切换特效
Nov 12 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
JavaScript数组的栈方法与队列方法详解
May 26 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
Mar 15 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 Javascript
微信小程序实现点击导航条切换页面
Nov 19 Javascript
微信小程序基础教程之worker线程的使用方法
Jul 15 #Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 #Javascript
微信小程序在其他页面监听globalData中值的变化
Jul 15 #Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 #Javascript
微信小程序全局变量改变监听的实现方法
Jul 15 #Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
Jul 15 #Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 #Javascript
You might like
php URL跳转代码 减少外链
2011/06/25 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
js比较日期大小的方法
2015/05/12 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
实用自动化运维Python脚本分享
2018/06/04 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
python爬虫如何解决图片验证码
2021/02/14 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
行政办公员自我评价分享
2013/12/14 职场文书
投标单位介绍信
2014/01/09 职场文书
十佳教师事迹材料
2014/01/11 职场文书