时间戳是世界时间,通过它计算小时会比东八区少8个小时,得加8才是北京时间;

—_—、,我竟然不知道。但是getHours()方法拿到的是电脑本地的时间。

踩了个坑,记录下避免下次忘记。

得➕8

得➕8

得➕8

重复三遍

new Date().getTime()%(60*60*24*1000)/(60*60*1000)+8

在线demo

核心代码:

 //target星期几,周日是0,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串function countdist(target, currentTime) {var date = new Date(currentTime);var day = date.getDay();var datetime = date.getTime();//当前的时间戳var oneDaySStime = 86400000;//一天的毫秒数var targetDate1 = target;//结束时间是周几??????console.log(date, "今天是", myDay(day));//当前时间距离【本】周2的天数,var targetDate1DateDis1 = targetDate1 - day;//这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示console.log("的剩余天数", targetDate1DateDis1);//考虑跨周情况//判断当前时间是否超过目标时间,操作,就计算下一周的//如果今天是周三了,那周二活动就是下一周的了if (targetDate1DateDis1 < 0) {targetDate1DateDis1 = targetDate1DateDis1 + 7;}let todayHSM = datetime % oneDaySStime;//【世界时间】今天已消耗的是分秒时间戳console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM / 1000 / 60 / 60 + 8)//剩余的天数的时间戳 -  (今天已过去的时间戳))//东八区时间比世界时间多8小时,得加8才是当前的时间let disMtime = targetDate1DateDis1 * oneDaySStime - (todayHSM + (8 * 1000 * 60 * 60));console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60 - 8));return {day: targetDate1DateDis1,mmtime: disMtime,//当前距离目标时间的相差时间戳targetMMtime:datetime+disMtime//目标时间的时间戳}}

完整代码:

<!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>通过时间戳,判断距离下一个周二和周六的距离</title>
</head><body><div style="display:flex;"><span>模拟今天日期 </span><select id="select"><option value="0" checked>延后0天</option><option value="1">延后1天</option><option value="2">延后2天</option><option value="3">延后3天</option><option value="4">延后4天</option><option value="5">延后5天</option><option value="6">延后6天</option><option value="7">延后7天</option></select><button id="btn">计算延后是星期几</button><span id="day">--</span></div><div>结果</div><div><p>这里的天数和小时是分开的,都是总数</p><div>距离周二活动还有:总天数(不够一天算一天):<span id="two"></span> 剩余总小时:<span id="twoH"></span></div><div>距离周六活动还有:总天数(不够一天算一天):<span id="six"></span> 剩余总小时:<span id="sixH"></span></div></div><script>//demo 辅助函数function myDay(date) {switch (date) {case 0:return "星期天"break;case 1:return "星期一"break;case 2:return "星期二"break;case 3:return "星期三"break;case 4:return "星期四"break;case 5:return "星期五"break;case 6:return "星期六"break;}};//demo 辅助函数function mockTime(afterDay) {var mockTimes = new Date().getTime();var oneDaySStime = 86400000;//一天的毫秒数return mockTimes + afterDay * oneDaySStime;}//target星期几,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串function countdist(target, currentTime) {var date = new Date(currentTime);var day = date.getDay();var datetime = date.getTime();//当前的时间戳var oneDaySStime = 86400000;//一天的毫秒数var targetDate1 = target;//结束时间是周几??????console.log(date, "今天是", myDay(day));//当前时间距离【本】周2的天数,var targetDate1DateDis1 = targetDate1 - day;//这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示console.log("的剩余天数", targetDate1DateDis1);//考虑跨周情况//判断当前时间是否超过目标时间,操作,就计算下一周的//如果今天是周三了,那周二活动就是下一周的了if (targetDate1DateDis1 < 0) {targetDate1DateDis1 = targetDate1DateDis1 + 7;}let todayHSM = datetime % oneDaySStime;//【世界时间】今天已消耗的是分秒时间戳console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM / 1000 / 60 / 60 + 8)//剩余的天数的时间戳 -  (今天已过去的时间戳))//东八区时间比世界时间多8小时,得加8才是当前的时间let disMtime = targetDate1DateDis1 * oneDaySStime - (todayHSM + (8 * 1000 * 60 * 60));console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60 - 8));return {day: targetDate1DateDis1,mmtime: disMtime}}var btn = document.getElementById("btn");var todayDay = document.getElementById("day");var two = document.getElementById("two");var six = document.getElementById("six");var twoH = document.getElementById("twoH");var sixH = document.getElementById("sixH");var myselect = document.getElementById("select");var index = myselect.selectedIndex;var value = myselect.options[index].value;function getCount(laterDay) {var dis1 = countdist(2, mockTime(laterDay));var dis2 = countdist(6, mockTime(laterDay));console.log("最终: 周二剩余天数", dis1, "周六的剩余天数", dis2);two.innerHTML = dis1.day;six.innerHTML = dis2.day;//东8区,所以要加8,时间戳是世界时间twoH.innerHTML = dis1.mmtime / 60 / 60 / 1000;sixH.innerHTML = dis2.mmtime / 60 / 60 / 1000;}function showData() {var index = myselect.selectedIndex;var value = myselect.options[index].value;console.log("模拟延后的时间", value)getCount(value);var date = new Date(mockTime(value));var day = date.getDay();todayDay.innerHTML = myDay(day);}btn.onclick = function () {showData();}showData();</script>
</body></html>

疑问:

如果我的软件的用户是全球的呢,总不能写死➕8吧???

这时候getTimezoneOffset函数就出场了

getTimezoneOffset() 方法可返回格林威治时间和本地时间之间的时差,以分钟为单位。

例如,如果时区为东2区, 将返回-120 。

全球一共划分为24个时区。 它们是中时区(零时区)、东1-12区,西1-12区

一下代码,如果在东8区得到的是-8,如果是西8区得到的将会是8,,可以根据正数或者负数得到当前用户是在东区还是西区

var d = new Date();var x = document.getElementById("demo");x.innerHTML=d.getTimezoneOffset()/60;

修复问题

上面的例子存在问题

  • 只能东八区使用,其他区会出问题
  • 如果出现世界世界和当前时间不是同一天的时候也会有问题(例如本地时间2点,那拿到今天已过去的小时会是26)

核心代码改成如下,

  //target星期几,周日是0,currentTime当前时间,可以是服务器返回的时间戳,或者符合日期格式的字符串function countdist(target, currentTime) {var date = new Date(currentTime);var day = date.getDay();//修复时区问题,得到当前时区时间的时间戳var datetime = date.getTime() - date.getTimezoneOffset()*60*1000;//【无论东区还是西区】当前的时间戳,当地的时间戳console.log("时间差",date.getTimezoneOffset()/60)var oneDaySStime = 86400000;//一天的毫秒数var targetDate1 = target;//结束时间是周几??????var nowIsTargetDay=false;//当前是否是已经到达目标日期console.log(date, "今天是", myDay(day));//当前时间距离【本】周2的天数,var targetDate1DateDis1 = targetDate1 - day;//这里只是算天数,没有把小时算在内,也没有考虑跨周的情况,所以不能直接显示console.log("的剩余天数", targetDate1DateDis1);//考虑跨周情况//判断当前时间是否超过(或等于)目标时间,操作,就计算下一周的//如果今天是周三了,那周二活动就是下一周的了if (targetDate1DateDis1 <= 0) {targetDate1DateDis1 = targetDate1DateDis1 + 7;}//当前时间已经在目标日期内if(targetDate1DateDis1==0){nowIsTargetDay=true; }let todayHSM = datetime % oneDaySStime;//【本地时间】今天已消耗的是分秒时间戳console.log("今天已消耗的是分秒时间戳", todayHSM, "今天已消耗的小时", todayHSM /(1000 * 60 * 60))//剩余的天数*一天的时间戳-今天已消耗的时间let disMtime = targetDate1DateDis1 * oneDaySStime-todayHSM;console.warn("最终: 剩余天数", targetDate1DateDis1, "剩余的总秒数", disMtime, "距离目标还剩余的小时", disMtime / (1000 * 60 * 60));return {nowIsTargetDay:nowIsTargetDay,//是否已经到了目标日期nextDayDiss: targetDate1DateDis1,//距离下一个活动开启的天数,不会为0,如果已经在目标日期了,会变成下一周的目标mmtime: disMtime,//距离下一次活动日期时间戳的差值//下次活动日期的时间戳,这里一定要用世界时间戳,不能用修复好的本地时间戳//因为外面使用的时候一般是直接new Date()来拿当前时间的时间戳的,这样拿到的是世界世界的时间戳//如果和我们修复的时区时间戳对比,就会出现差,例如东八区的话,new Date()-datetime+disMtime 会多出8小时netDaytmpTime: date.getTime()+disMtime }}

通过时间戳,计算距离下一个周二和周六的时间距离相关推荐

  1. 获取下一个周几的日期

    获取下一个周几的日期 直接上代码: Integer day = null; //初始化,值为1~7,分别代表周一~周日 LocalDate weekDate = LocalDate.now().wit ...

  2. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  3. PHP获取上个月当月下一个月的相对应时间的详解

    时间各个字母的含义: a - "am" 或是 "pm" A - "AM" 或是 "PM" d - 几日,二位数字,若不足 ...

  4. 量子计算:下一个大风口,还是一个热炒概念?

    量子计算作为一种前沿的技术,是近年来备受瞩目的新兴领域.你可以从以下维度谈谈你对这项新技术的看法.. 一.量子计算为何可能会成为一个风口?(其作用及重要性) 随着科技的不断进步,全球经济正在迈向一个全 ...

  5. dayjs在周日获取当前周第一天的时间但是显示下一周第一天的时间-解决办法

    安装dayjs npm install dayjs yarn add dayjs pnpm install dayjs 方法一. 判断当天是不是周日 如果是就减一周 dateHandler(week ...

  6. 距离下个当前日期还有多少天(距离下次生日还有多久)

    public Long inday( Date brithday ){SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM ...

  7. java中计算明年今天的日期_计算今天之后的下一个周年日

    计算某人下一个生日周年纪念日最快/最整洁的方法是什么? 例如,如果我知道一个人出生于1990年1月31日,而今天是2000年2月10日,他们的下一个周年纪念日将是2001年1月31日. 2月29日至3 ...

  8. 云计算的下一个时代——“容器时代”

    内容来源:2017年4月21日,京东云产品部总经理郭理靖在"K8S技术社区"进行<云计算的下一个时代--"容器时代">演讲分享.IT 大咖说(Id ...

  9. 大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

    2019独角兽企业重金招聘Python工程师标准>>> 大家晚上好,我是今天的提笔人嗅嗅. 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰"巴黎不哭",已 ...

最新文章

  1. 为什么华为200万招聘AI博士,马斯克却推出脑机接口对抗AI?
  2. 最全 Neo4j 可视化图形数据库的工具!
  3. 解题报告:Fake Maxpooling(单调队列求矩阵的和)
  4. 2020年度最佳的23个的机器学习项目(附源代码)
  5. 使用C#+Linq+SQL快速开发业务
  6. 从零开始的51单片机——(1)点亮LED
  7. 手机百度首页的localStorage的使用实例
  8. 【渝粤教育】国家开放大学2018年春季 8625-22T老年心理健康 参考试题
  9. Logstash配置语法及相关命令
  10. 时区日期处理及定时 (NSDate,NSCalendar,NSTimer,NSTimeZone) -- IOS(实例)
  11. mysql 修改编码不成功解决办法
  12. Android笔记 get方式提交数据到服务器 避免乱码 demo
  13. 一个使用多年的Makefile模板
  14. python Image
  15. 解决mysql分页数据错乱问题
  16. ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例
  17. dao-service-servlet-jsp构建简易web通讯录(三层开发)软件安装
  18. sqlserver查询包含在一个字段里面的某一个元素
  19. ICDAR发票识别冠军(文字检测Corner)
  20. git 停止维护了,官网无法下载

热门文章

  1. python做数据查询系统_[Python实战] 功能简单的数据查询及可视化系统
  2. 给编程初学者的一些建议
  3. 当iPhone穿上这个“马甲”你还认不认识它?机甲MESUIT体验评测
  4. Qt中QVector赋值速度与数组赋值速度的测试比较
  5. 您当前未使用连接到nvidia gpu的显示器-解决方案
  6. tableau做折线图_【tableau入门教程04】折线图
  7. JavaScript保留指定位数的小数方法
  8. 无限幻斗那个服务器人多,无限幻斗无垠之境阵容推荐 魂灯形态挑战阵容解析...
  9. STM32睡眠模式低功耗(停止模式)
  10. MySQL存储引擎的区别与比较