这个代码的思路是:

  1. 活动从那天开始?
  2. 活动开始那天还剩余多少时间
  3. 今天是活动周期中的那一天?
  4. 距离本次周期结束还有多少时间戳

基础代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>//计算几天是三天中的第几天function computedOrderDay(starTime, todayTime) {let threeDayTime = 86400000 * 3;let disTime = todayTime - starTime;let time = disTime % threeDayTime;//得到差值除以3天时间戳的余数(剩余的是不满三天的时间)if (time - 86400000 * 2 > 0) {return 3}else if (time - 86400000 > 0) {return 2;}else {return 1;}}function formatTime(time) {let t = new Date(time);return ` ${t.getFullYear()}年 ${t.getMonth()+1} 月${t.getDate()}日${t.getHours()}时${t.getMinutes()} 分${t.getSeconds()}秒`}//开始时间var starTime = new Date("2022/11/26 20:00:00").getTime();var todayTime = new Date().getTime();var nextTargetTime;//下一个结束日期的时间戳//几天超过了目标时间if (todayTime >= starTime) {//开始时间当天的剩余时间let startlesstime=86400000-starTime%86400000;//计算周期之外还剩多少时间let oneLoopTime=86400000*3;//当前周期还剩余的时间let looplesstime=oneLoopTime-todayTime%(oneLoopTime);//今天时间戳【加】一个周期的剩余时间戳【减去】开始时间一天剩余的时间戳nextTargetTime = todayTime +looplesstime-startlesstime;}else{//如果没超过呢,代码和上面一样的,就不要再写if else啦}console.warn(`下次结束时间 ${formatTime(nextTargetTime)},今天是一周期内的第${computedOrderDay(starTime,todayTime)}天`)</script>
</body></html>

在线调试

在线调试

图解

可能一天出现2个不同的剩余天数?

他算的不是完整的天数,不是不够一天算一天的那种,而是按照24小时有多少个时间戳,这个24小时是从开始时间算起来的,如果是20点开始,这个24小时就是20点开始算的

优化

上面的代码存在问题,计算今天剩余多少时间要用本地时间戳,否则遇到本时区的时间和世界世界跨天的话,就会出现问题,不信的话,试试把上面在线调试的代码的开始时间改为0点

为什么要用本地时间戳???
        因为今天过去了多少小时就是用本地时间算了,例如东八区7点,就是过去了7小时
        但是默认的时间戳是世界世界,格林兰时间对应的0时区,东8区7点对应的世界时间戳是格陵兰时间的23点,
        这样计算的今天剩余时间是1小时,实际上本地时间剩余的小时是24-7=17

修复代码如下:


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>//计算几天是三天中的第几天function computedOrderDay(starTime, todayTime) {let threeDayTime = 86400000 * 3;let disTime = todayTime - starTime;let time = disTime % threeDayTime;//得到差值除以3天时间戳的余数(剩余的是不满三天的时间)if (time - 86400000 * 2 > 0) {return 3}else if (time - 86400000 > 0) {return 2;}else {return 1;}}function formatTime(time) {let t = new Date(time);return ` ${t.getFullYear()}年 ${t.getMonth() + 1} 月${t.getDate()}日${t.getHours()}时${t.getMinutes()} 分${t.getSeconds()}秒`}//开始时间===================var starDay = new Date("2022/11/26 00:00:00");//本地时间时间戳var starTime = starDay.getTime();//本地世界时间时间戳var starTimeLocal = starDay.getTime() - starDay.getTimezoneOffset() * 60 * 1000;//今天时间======================var todayday = new Date();//世界时间戳var todayTime = todayday.getTime();//本地时间戳var todayTimeLocal = todayday.getTime() - todayday.getTimezoneOffset() * 60 * 1000;var nextTargetTime;//下一个结束日期的时间戳//3天一个周期对应的时间戳总值let oneLoopTime = 86400000 * 3;/*为什么要用本地时间戳???因为今天过去了多少小时就是用本地时间算了,例如东八区7点,就是过去了7小时但是默认的时间戳是世界世界,格林兰时间对应的0时区,东8区7点对应的世界时间戳是格陵兰时间的11点,这样计算的今天剩余时间是1小时,实际上本地时间剩余的小时是24-7=17*///开始时间当天的剩余时间let startlesstime = 86400000 - starTimeLocal % 86400000;//计算周期之外还剩多少时间//当前周期还剩余的时间,需要用本地时间戳,这里的今天时间戳肯定也需要用到【本地的时间戳】了!!!!!let looplesstime = oneLoopTime - todayTimeLocal % (oneLoopTime);//今天时间戳【加】一个周期的剩余时间戳【减去】开始时间一天剩余的时间戳//这里的【今天】时间戳肯定是要用世界时间戳,否则给new Date()使用的时候就出问题了,因为它接受的要求的是世界世界戳nextTargetTime = todayTime + looplesstime - startlesstime;console.warn(`下次周期开始时间 ${formatTime(nextTargetTime)},今天是一周期内的第${computedOrderDay(starTime, todayTime)}天`)</script>
</body></html>

周期活动计算,三天一次活动相关推荐

  1. 计算机知识竞赛活动工作总结,知识竞赛活动总结范文3篇

    知识竞赛活动可以带动学生的学习兴趣,YJBYS小编为大家搜集了关于知识竞赛活动总结,供大家参考借鉴, 知识竞赛活动总结(一) 一. 活动时间 20XX年11月25日晚7:00 二. 活动地点 南院T1 ...

  2. 博客园北京俱乐部第三次技术活动(2009/5/23)总结

    在博客园各位园友的支持下,博客园北京俱乐部第三次技术交流活动在微软成功举行.本次活动共有40位园友参与,分别由四位朋友带来了4个精彩主题.最大的感谢送给我们免费提供场地的微软中国,以及提供礼品赞助的博 ...

  3. Redis简单案例(三) 连续登陆活动的简单实现

    原文:Redis简单案例(三) 连续登陆活动的简单实现 连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送 ...

  4. 弘辽科技:拼多多活动布局三大招!

    原标题<弘辽科技:拼多多活动布局三大招!> 很多拼多多商家平时经营店铺经营的好好的,但一遇到重大活动的时候,店铺销量反而不好,这是为什么呢?有很大的原因是因为商家不懂如何好好利用这个重大活 ...

  5. 红领巾小创客机器人活动计划_红领巾小创客活动方案三篇

    每一个孩子具有一颗美丽的心灵,首先要培养孩子具有一双发现美的眼睛.队员通过摄影.绘画.制作等形式发现.创造美.下面是小编带来的三篇红领巾小创客活动方案,希望对大家有所帮助! 红领巾小创客活动方案1 一 ...

  6. 计算机游戏活动总结,关于亲子游戏活动总结最新三篇

    [https://www.ytyaosen.cn--600分大学] 在亲子游戏中充分体现了家园互动,让孩子开心过六一,感受到童年的快乐.下面思而学教育网小编跟大家分享几篇亲子活动总结,希望对大家有所帮 ...

  7. 计算机绘画社团活动总结,关于绘画社团的活动总结三篇

    [导语]绘画是一门艺术,是一种修身养性的良好途径.绘画社团可以让学生在学习过程中能丰富艺术修养,培养学生审美文化素质,提高审美能力,陶冶情操,启迪智慧.下面无忧考网就给大家分享下关于绘画社团的活动总结 ...

  8. 三年级计算机活动记录,小学科学三年级下册活动记录表

    <小学科学三年级下册活动记录表>由会员分享,可在线阅读,更多相关<小学科学三年级下册活动记录表(6页珍藏版)>请在人人文库网上搜索. 1.小学科学三年级下册活动记录表小学三年级 ...

  9. 电商产品设计:后台营销功能模块设计-砍价活动(三)

    砍价是诞生在社交电商的时代,是社交电商最常见的几种玩法之一,目的都是低成本获客,在完成拉新及留存的作用的基础上,实现粉丝裂变增长的商业目标. 一.什么是砍价活动,为什么要做,有什么好处? 1.提高用户 ...

最新文章

  1. Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
  2. jQuery的进行解决layui闪退的问题
  3. The Geometry has no Z values 解决办法
  4. python识别验证码ocr_Python3使用tesserocr识别字母数字验证码
  5. 【基金研究】《公募权益类基金投资者盈利洞察报告》
  6. solve函数c语言_c语言:回溯解数独程序
  7. 求义隆单片机c语言红外解码程序,吐槽义隆单片机,顺便送上超轻红外解码程序....
  8. 苹果6运行内存是多少_iPhone 12为什么不标注运行内存?安卓转苹果手机是入11还是入12呢?...
  9. MySQL表sql语句增删查改_学会这些操作你就不会栓Q(狗头)
  10. Window下批量文件处理
  11. MySQL——超详细数据库触发器教程
  12. ln -s 命令详解
  13. 中文单栏latex模板
  14. Apache Impala —— 3.4.0版本官方文档百度网盘下载链接
  15. 淘宝api app版淘宝店铺商品搜索
  16. MYSQL函数 group_concat巨坑!!!
  17. 关于JAVA的jdk安装和环境配置
  18. Scipy文件输入/输出
  19. 硅谷速递 | 人人都在谈的 “数据驱动” 到底是什么?如何才算实现数据驱动?...
  20. 拥抱ROS2系列:ROS2概述和实践入门

热门文章

  1. 关于ScrollView中嵌套FlatList的一点经验
  2. Python高级编程之数据库sqlite3(一)
  3. RIO——健壮的IO包
  4. java 解zip文件(ZipInputStream)
  5. R语言时间序列平稳性几种单位根检验(ADF,KPSS,PP)及比较分析
  6. 基于pygame做的小游戏
  7. Remoting简单实例[]
  8. jmeter接口自动化,你敢想,我敢玩
  9. 网管型交换机和非网管型交换机的区别
  10. 22个关于ES6的最新面试题汇总整理