Python、Java、JavaScript、C、Go等编程语言如何实现“定时器”功能

30 篇文章 1 订阅
4 篇文章 0 订阅

这是CSDN平台2月推出的一个活动(活动链接为:CSDN 征文活动),聊聊时间的话题,小编我也不知道有什么好聊的时间的话题,看了CSDN给出的部分话题上,有一个这样的话题,如何用各种编程语言实现“定时器”,觉得这个不错,于是就写了这篇博文。

1. “定时器”原理

首先,小编讲述一下小编实现的“定时器”原理,利用到转义字符,主要使用的转义字符为:\r,在window系统,它表示:\r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖(光标在该行的头部),小编基于这个原理,从而动态显示“定时器”上秒、分、时数的变化。当然,这个代码也是存在一定问题的,如果读者的电脑是其他系统的,下述代码运行结果可能会有一定问题喔!(如:在Mac中,\r表示换行)。另外,小编实现的“定时器”除了Python、Html外,其他实现的编程语言都没有添加提示功能(就是到点时,播放一个音频文件)。

下面是运用几种常见的编程语言实现“定时器”功能(就比如午睡吧!从某时刻程序开始运行,到程序结束时提醒用户该起来敲代码了)。

2. Python 实现
import time

time_2 = 20
# 计时时间(单位:秒)
for i in range(time_2):
    time.sleep(1)
print('主人,该起来敲代码了!')

这代码的确一点毛病也没有,但是,却起不到提示作用(毕竟只是在控制台打印输出信息而已)
请添加图片描述
为此,可以增加一个音频文件播放,如下:

import time
from pygame import mixer

time_2 = 1
# 计时时间(单位:秒)
filename = '1.mp3'
# 音频文件存储路径
for i in range(time_2):
    time.sleep(1)
print('主人,该做XXX事情了!')

mixer.init()
mixer.music.load('1.mp3')
mixer.music.set_volume(1)
mixer.music.play(loops=-1)
# loops=-1表示重复播放
while mixer.music.get_busy():
    str_1 = input("输入:(只要不为空即可)")
    if str_1 != '':
        mixer.music.stop()
        #  结束音乐播放
        mixer.stop()
        # 停止播放所有通道
        break

运行结果(音频文件会重复播放,直到用户在控制台输入一个非空字符串才会停止):

Python实现计时器


但是这样好像也不怎么完美,就是看不到计时时间的倒计时,于是小编引入 sys模块,增加一个时间倒计时的显示,参考代码如下:

import time
from pygame import mixer
import sys

time_2 = 3660
# 计时时间(单位:秒)
filename = '1.mp3'


# 音频文件存储路径

def get_str(sum_seconds: int):
    hour = sum_seconds // (60 * 60)
    # 小时
    minute = (sum_seconds - 3600 * hour) // 60
    # 分
    second = sum_seconds - hour * 3600 - minute * 60
    # 秒
    return '{:02d}:{:02d}:{:02d}'.format(hour, minute, second)


for i in range(time_2, -1, -1):
    sys.stdout.write('\r')
    sys.stdout.write(get_str(i))
    sys.stdout.flush()
    time.sleep(1)
print('\n主人,该做XXX事情了!')

mixer.init()
mixer.music.load('1.mp3')
mixer.music.set_volume(1)
mixer.music.play(loops=-1)
# loops=-1表示重复播放
while mixer.music.get_busy():
    str_1 = input("输入:(只要不为空即可)")
    if str_1 != '':
        mixer.music.stop()
        #  结束音乐播放
        mixer.stop()
        # 停止播放所有通道
        break

运行结果:

Python实现计时器

3. Java实现

Java实现最简单的代码肯定是这个了。

public class Test {
	public static void main(String[] args) {
		int time_2 = 5;
		for(int i=0;i<time_2;i++) {
			try {
				Thread.sleep(1000);
				// 单位:毫秒
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("主人,该起来敲代码了!");
	}
}

如果使用Java也想达到上述Python那种效果,参考代码如下:

public class Test {
	private static String getStr(int sumSeconds) {
		int hour = sumSeconds/3600;
		int minute = (sumSeconds - hour*3600)/60;
		int second = sumSeconds - hour*3600 - minute *60;
		return String.format("%02d:%02d:%02d", hour,minute,second);
	}
	
	public static void main(String[] args) throws Exception{
		int time_2 = 3660;
		String str_2 = "\r";
		for(int i=time_2;i>=0;i--) {
			String timeStr = getStr(i);
			System.out.print(str_2);
			System.out.print(timeStr);
			try {
				Thread.sleep(1000);
				// 单位:毫秒
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("\n主人,该起来敲代码了!");
	}
}

【注】:没有音频文件的播放。
运行结果(直接使用cmd命令运行,上述代码直接在eclipse上运行,还是会出现换行问题,idea没有试过,不知道会不会出现那个问题,但是在命令窗口上运行是没有问题的。):
请添加图片描述

4. JavaScript实现(需要下载nodejs才行)
var time_2 = 5*60;
// 单位:秒
var fun1 = (sum_second) => {
	let hour = parseInt(sum_second / 3600);
	let minute = parseInt((sum_second - 3600*hour) / 60);
	let second = sum_second - hour * 3600 - minute * 60;
	hour = hour > 10 ? '' + hour : '0' + hour;
	minute = minute > 10 ? '' + minute : '0' + minute;
	second = second > 10 ? '' + second : '0' + second;
	return `${hour}:${minute}:${second}`;
}

var fun2 = () => {
	let i = time_2;
	let timer = setInterval(() => {
		if (i < 0) {
			clearInterval(timer);
			console.log('\n主人,该起来敲代码了!');
		}
		process.stdout.write('\r');
		process.stdout.write(fun1(i));
		// 不会换行
		i--;
	}, 1000)
}

fun2();

运行结果:
请添加图片描述

5. C语言实现

参考代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int main(){
    int time_2 = 5;
    // 秒数(单位:秒)
    for(int i=time_2;i>0;i--){
        int sumSecond = i;
        int hour = sumSecond / 3600;
        int minute = (sumSecond - hour * 3600) / 60;
        int second = sumSecond - hour * 3600 - minute * 60;
        printf("%02d:%02d:%02d",hour,minute,second);
        printf("\r");
        Sleep(1000);
    }
    printf("\n主人,该起来敲代码了!\n");
    system("pause");
    return 0;
}

运行结果如下:
在这里插入图片描述
【注】:小编上述实现代码是在vscode上运行的,如果读者在其他编辑器上运行,可以不加这句代码(system(“pause”);),依旧可以运行成功的!

6. Go语言实现

参考代码如下:

package main

import (
	"fmt"
	"time"
)

func main(){
	time_2 := 3660
	// 时间(单位:秒)
	for i := time_2;i > 0;i -- {
		hour := i/3600
		minute := (i - 3600 * hour)/60
		second := i - hour * 3600 - minute * 60
		timeStr := fmt.Sprintf("%02d:%02d:%02d",hour,minute,second);
		fmt.Print(timeStr);
		time.Sleep(time.Duration(1)*time.Second);
		fmt.Print("\r");
	}
	fmt.Println("主人,该起来敲代码了!");
}

运行结果:
请添加图片描述

7. HTML实现

参考代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>定时器</title>
	</head>
	<style type="text/css">
		*{
			margin: 0;
			padding: 0;
		}
		body{
			width: 100%;
		}
		.time{
			margin: 0 auto;
			/* 设置居中显示 */
			text-align: center;
			width: 160px;
			font-family: ;
			font-size: 40px;
		}
	</style>
	<body>
		<div class="time">00:00:00</div>
		<audio loop src="./1.mp3"></audio>
	</body>
	<script type="text/javascript">
		var sumSecond = 5;
		 // 单位:秒
		var timeEle = document.querySelector('.time');
		var audioEle = document.querySelector('audio');
		var timer = setInterval(()=>{
			let hour = parseInt(sumSecond/3600);
			let minute = parseInt((sumSecond-hour*3600)/60);
			let second = sumSecond - hour * 3600 - minute * 60;
			hour = '' + hour;
			if(hour < 10)
				hour = '0' + hour;
			minute = '' + minute;
			if(minute < 10)
				minute = '0' + minute;
			second = '' + second;
			if(second < 10)
				second = '0' + second;
			timeEle.innerHTML = `${hour}:${minute}:${second}`;
			sumSecond --;
			if(sumSecond<0){
				clearInterval(timer);
				audioEle.play();
				// 音频播放
			}
		},1000);
	</script>
</html>

直接把这个html文件放到谷歌浏览器、Edge浏览器(QQ浏览器上运行没有问题)上运行,会报如下错误:
请添加图片描述
报错信息为:the user didn’t interact with the document first.
请添加图片描述
看了一位大佬的文章上讲:
请添加图片描述
说明浏览器版本太高,不支持了,所以要想上述代码成功运行,可以下载一个QQ浏览器或者类似的浏览器。(当然,如果读者有好的改进建议,欢迎评论)
欢迎各位大佬评论,指出上述代码中存在的问题。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坚持不懈的大白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值