马黑黑 发表于 2022-10-10 21:36

整点干事

本帖最后由 马黑黑 于 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>


马黑黑 发表于 2022-10-10 21:37

<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>

红影 发表于 2022-10-10 22:19

看到标题,还以为是整点事干,是想整事情呢{:4_189:}

马黑黑 发表于 2022-10-10 22:20

红影 发表于 2022-10-10 22:19
看到标题,还以为是整点事干,是想整事情呢

俺是那样的人吗{:4_173:}

红影 发表于 2022-10-10 22:23

if(d.getSeconds() % 60 === 0)
这句看不明白,虽然有注解。当下的秒数,用个百分号,就是和60比较么?

红影 发表于 2022-10-10 22:26

马黑黑 发表于 2022-10-10 21:37
效果演示:请开启你的Windows时钟对比




这个可以校验自己电脑时钟?出来的值是什么?看到这个值是变化的。

马黑黑 发表于 2022-10-10 22:29

红影 发表于 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:30

红影 发表于 2022-10-10 22:26
这个可以校验自己电脑时钟?出来的值是什么?看到这个值是变化的。

不是校验时钟,是到整点的时候做什么事情。这是一个需求,比如宣传牌:每到整点,换一条宣传语。

红影 发表于 2022-10-11 08:44

马黑黑 发表于 2022-10-10 22:20
俺是那样的人吗

哈哈,今天来看,还是这样感觉,这句太好玩了{:4_182:}

红影 发表于 2022-10-11 08:46

马黑黑 发表于 2022-10-10 22:29
d.getSeconds() 获得当下秒数,比如是 x 吧。

x % 60 这样的式子,就是计算 x 能不能 被 60 整除,就 ...

这个是依次从0走到59的吧,嗯,这样只有再次走到0才能进入下一分钟。

红影 发表于 2022-10-11 08:48

马黑黑 发表于 2022-10-10 22:30
不是校验时钟,是到整点的时候做什么事情。这是一个需求,比如宣传牌:每到整点,换一条宣传语。

你现在的是到整点了,出现一个随机数字吧,前面我弄错了,以为你的这个小数就是计算后的余数{:4_173:}

马黑黑 发表于 2022-10-11 12:34

红影 发表于 2022-10-11 08:48
你现在的是到整点了,出现一个随机数字吧,前面我弄错了,以为你的这个小数就是计算后的余数

Math.random() 生成 0-1(包含0不包含1)的随机数,我多次提到过的

马黑黑 发表于 2022-10-11 12:38

红影 发表于 2022-10-11 08:46
这个是依次从0走到59的吧,嗯,这样只有再次走到0才能进入下一分钟。

是的。这是利用 getSeconds() 之类的方法所返回的值做出的机制选择。返回到59时,其实已经到整点了,接着返回的0则是进入下一分钟(点钟)了。如果一定要在 59 时执行任务,则可以这样:

if(d.getSeconds() > 0 && d.getSeconds % 59 === 0) {
    //执行任务
}

以上做法,用了组合条件,这样才是真正的整点干事。

红影 发表于 2022-10-11 15:26

马黑黑 发表于 2022-10-11 12:34
Math.random() 生成 0-1(包含0不包含1)的随机数,我多次提到过的

那么小数后的位数是多少,这个是自动的么?

红影 发表于 2022-10-11 15:29

马黑黑 发表于 2022-10-11 12:38
是的。这是利用 getSeconds() 之类的方法所返回的值做出的机制选择。返回到59时,其实已经到整点了,接着 ...

这个能等于0么?是等于1吧?

马黑黑 发表于 2022-10-11 18:13

红影 发表于 2022-10-11 15:29
这个能等于0么?是等于1吧?

你没看清楚。getSeconds() 返回值从 0 到 59,这是它的规范。

马黑黑 发表于 2022-10-11 18:13

红影 发表于 2022-10-11 15:26
那么小数后的位数是多少,这个是自动的么?

什么叫随机,这就是

红影 发表于 2022-10-11 20:17

马黑黑 发表于 2022-10-11 18:13
你没看清楚。getSeconds() 返回值从 0 到 59,这是它的规范。

我是说& d.getSeconds % 59 === 0这句,既然组合规定大于0 ,那这句好像不可能出现0 ?

红影 发表于 2022-10-11 20:18

马黑黑 发表于 2022-10-11 18:13
什么叫随机,这就是

哦哦,可以任意给出0-1之间的数啊。

马黑黑 发表于 2022-10-11 21:52

红影 发表于 2022-10-11 20:18
哦哦,可以任意给出0-1之间的数啊。

随机就是生成那么一个数
页: [1] 2 3 4
查看完整版本: 整点干事