这是CSDN平台2月推出的一个活动(活动链接为:CSDN 征文活动),聊聊时间的话题,小编我也不知道有什么好聊的时间的话题,看了CSDN给出的部分话题上,有一个这样的话题,如何用各种编程语言实现“定时器”,觉得这个不错,于是就写了这篇博文。
1. “定时器”原理
首先,小编讲述一下小编实现的“定时器”原理,利用到转义字符,主要使用的转义字符为:\r,在window系统,它表示:\r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖(光标在该行的头部),小编基于这个原理,从而动态显示“定时器”上秒、分、时数的变化。当然,这个代码也是存在一定问题的,如果读者的电脑是其他系统的,下述代码运行结果可能会有一定问题喔!(如:在Mac中,\r表示换行)。另外,小编实现的“定时器”除了Python外,其他实现的编程语言都没有添加提示功能(就是到点时,播放一个音频文件)。
下面是运用几种常见的编程语言实现“定时器”功能(就比如午睡吧!从某时刻程序开始运行,到程序结束时提醒用户该起来敲代码了)。
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("主人,该起来敲代码了!");
}
运行结果:
欢迎各位大佬评论,指出上述代码中存在的问题。