PythonJavaJavaScriptCGo等编程语言如何实现“定时器”功能

Posted 坚持不懈的大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PythonJavaJavaScriptCGo等编程语言如何实现“定时器”功能相关的知识,希望对你有一定的参考价值。

这是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浏览器或者类似的浏览器。(当然,如果读者有好的改进建议,欢迎评论)
欢迎各位大佬评论,指出上述代码中存在的问题。

以上是关于PythonJavaJavaScriptCGo等编程语言如何实现“定时器”功能的主要内容,如果未能解决你的问题,请参考以下文章

NumPy学习笔记 一

NumPy学习笔记 三 股票价格

郑君里 信号与系统 “算子符号”为啥不做重点

Java 使用POI操作EXCEL及测试框架搭建测试开发的一些想法

通信原理第7版樊昌信,曹丽娜课后答案通信原理第七版课后习题答案