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

时间戳是世界时间,通过它计算小时会比东八区少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 
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陆康永

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

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

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

打赏作者

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

抵扣说明:

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

余额充值