整点干事
本帖最后由 马黑黑 于 2022-10-10 22:34 编辑有一需求:每到整点,执行一个任务。任务不能随便是什么,是指定的,我们假设它已经写进了一个函数,比如下面这样:
function showMsg() {
papa.innerText = Math.random();
}
这是在 papa 标签打印出一个随机数。
我们介绍过定时器 setInterval,如果用它的话,我们可以完成这么一个功能:每隔多长时间做一件事情。一个钟时间太长,不好测试,我们就假设是每隔一分钟执行一次相同的任务吧:
setInterval(function() {
showMsg();
},60000);
上面的语句也可以写成:
setInterval(showMsg, 60000);
两种写法的区别是,第一种,可以在两个花括号之间做较为复杂的事情(就是写入更多的代码),第二种,一般就一个表达式,是函数的话函数不能带括号,直接用函数名。
显然,上面两种定时器语句,都可以正常运行,运行结果是每隔一分钟就在 papa 标签显示一个随机浮点数。但这个做法,与题意不符:题意要求每到整点执行相同任务。
实现题意要求,需要用到定时器,但在使用定时器之前,还需要用到别的与日期时间相关的知识:Date() 对象。
Date() 对象是很多语言都有的基于日期时间的对象,它会提供一个时间戳接口,我们通过创建实例与之建立连接并应用它:
let d = new Date();
然后我们就可以通过已经将 Date() 对象实例化了的变量 d 来操作相关数据,例如,获取:
let sec = d.getSeconds(); // 当下的秒数 0 ~ 59
let min = d.getMinutes(); // 当下的分钟数 0 ~ 59
let hour = d.getHours(); // 当下的小时数 0 ~ 23
还有很多,我们暂时最多用到这些。
我们将以上的新东西,用到 setInterval 定时器中来。整点干事,间隔时间太长,不好测试,我们将整点改为整分。实现的代码框架是这样:
let timer = setInterval(function myFun() {
// 这里做点啥 :秒数被 60 整除就开干
}, 1000);
定时器每隔一秒钟(红色数字1000代表一秒钟)检测一次从 Date() 对象获得的时间戳那里所获取的秒数是不是被 60 整除,如果是,干活。为什么不是被 59 整除?因为,59 会被 59 和 0 整除,如果用了 59 ,则一个一分钟的时间周期里,任务会连续执行两次,而60,在现实中的一分钟里的时间戳的 getSeconds() 周期里,1 ~ 59 都不能整除它,只有 0 整除它,任务只执行一次——进入下一分钟的时候执行。
干活的代码上来吧:
let timer = setInterval(function myFun() {
let d = new Date(); //获得时间戳信息
if(d.getSeconds() % 60 === 0) { //所取的秒数取 60 的余数,等于 0 时表示进入下一分钟,则 ——
showMsg(); //执行任务
}
}, 1000);
完整代码:
<div id="papa"></div>
<script>
let timer = setInterval(function myFun() {
let d = new Date();
if(d.getSeconds() % 60 === 0) {
showMsg();
}
}, 1000);
function showMsg() {
papa.innerText = Math.random();
}
</script>
<p>效果演示:请开启你的Windows时钟对比</p>
<div id="papa"></div>
<script>
let timer = setInterval(function myFun() {
let d = new Date();
if(d.getSeconds() % 60 === 0) {
showMsg();
}
}, 1000);
function showMsg() {
papa.innerText = Math.random();
}
</script> 看到标题,还以为是整点事干,是想整事情呢{:4_189:} 红影 发表于 2022-10-10 22:19
看到标题,还以为是整点事干,是想整事情呢
俺是那样的人吗{:4_173:} if(d.getSeconds() % 60 === 0)
这句看不明白,虽然有注解。当下的秒数,用个百分号,就是和60比较么? 马黑黑 发表于 2022-10-10 21:37
效果演示:请开启你的Windows时钟对比
这个可以校验自己电脑时钟?出来的值是什么?看到这个值是变化的。 红影 发表于 2022-10-10 22:23
if(d.getSeconds() % 60 === 0)
这句看不明白,虽然有注解。当下的秒数,用个百分号,就是和60比较么?
d.getSeconds() 获得当下秒数,比如是 x 吧。
x % 60 这样的式子,就是计算 x 能不能 被 60 整除,就是 x 取 60 的余数,如果等于 0 ( x === 0 ),表示 x 被 60 整除,条件成立,就干下面的事情(运行函数):
showMsg();
d.getSeconds() 获得的数是 0 ~ 59,这些数,只有 0 可以被 60 整除,就是,进入下一分钟的时候。
红影 发表于 2022-10-10 22:26
这个可以校验自己电脑时钟?出来的值是什么?看到这个值是变化的。
不是校验时钟,是到整点的时候做什么事情。这是一个需求,比如宣传牌:每到整点,换一条宣传语。 马黑黑 发表于 2022-10-10 22:20
俺是那样的人吗
哈哈,今天来看,还是这样感觉,这句太好玩了{:4_182:} 马黑黑 发表于 2022-10-10 22:29
d.getSeconds() 获得当下秒数,比如是 x 吧。
x % 60 这样的式子,就是计算 x 能不能 被 60 整除,就 ...
这个是依次从0走到59的吧,嗯,这样只有再次走到0才能进入下一分钟。 马黑黑 发表于 2022-10-10 22:30
不是校验时钟,是到整点的时候做什么事情。这是一个需求,比如宣传牌:每到整点,换一条宣传语。
你现在的是到整点了,出现一个随机数字吧,前面我弄错了,以为你的这个小数就是计算后的余数{:4_173:} 红影 发表于 2022-10-11 08:48
你现在的是到整点了,出现一个随机数字吧,前面我弄错了,以为你的这个小数就是计算后的余数
Math.random() 生成 0-1(包含0不包含1)的随机数,我多次提到过的 红影 发表于 2022-10-11 08:46
这个是依次从0走到59的吧,嗯,这样只有再次走到0才能进入下一分钟。
是的。这是利用 getSeconds() 之类的方法所返回的值做出的机制选择。返回到59时,其实已经到整点了,接着返回的0则是进入下一分钟(点钟)了。如果一定要在 59 时执行任务,则可以这样:
if(d.getSeconds() > 0 && d.getSeconds % 59 === 0) {
//执行任务
}
以上做法,用了组合条件,这样才是真正的整点干事。
马黑黑 发表于 2022-10-11 12:34
Math.random() 生成 0-1(包含0不包含1)的随机数,我多次提到过的
那么小数后的位数是多少,这个是自动的么? 马黑黑 发表于 2022-10-11 12:38
是的。这是利用 getSeconds() 之类的方法所返回的值做出的机制选择。返回到59时,其实已经到整点了,接着 ...
这个能等于0么?是等于1吧? 红影 发表于 2022-10-11 15:29
这个能等于0么?是等于1吧?
你没看清楚。getSeconds() 返回值从 0 到 59,这是它的规范。 红影 发表于 2022-10-11 15:26
那么小数后的位数是多少,这个是自动的么?
什么叫随机,这就是 马黑黑 发表于 2022-10-11 18:13
你没看清楚。getSeconds() 返回值从 0 到 59,这是它的规范。
我是说& d.getSeconds % 59 === 0这句,既然组合规定大于0 ,那这句好像不可能出现0 ? 马黑黑 发表于 2022-10-11 18:13
什么叫随机,这就是
哦哦,可以任意给出0-1之间的数啊。 红影 发表于 2022-10-11 20:18
哦哦,可以任意给出0-1之间的数啊。
随机就是生成那么一个数