0

0

Java如何开发一个简单的控制台版考试倒计时提醒_时间偏移计算

P粉602998670

P粉602998670

发布时间:2026-03-09 15:18:35

|

348人浏览过

|

来源于php中文网

原创

倒计时不准的根本原因是误用易变的当前时间而非固定起点基准。正确做法是启动时记录system.currenttimemillis()为起点,后续全靠差值计算;用\r覆盖刷新避免滚屏;时间偏移需用zoneddatetime解析服务端iso时间并转本地毫秒;sleep应动态校准下次刷新时刻而非固定间隔。

java如何开发一个简单的控制台版考试倒计时提醒_时间偏移计算

倒计时不准?先确认系统时钟和 System.currentTimeMillis() 的关系

Java 控制台倒计时不准,90% 是因为误把「本地时间显示」当成了「倒计时基准」。倒计时必须用绝对时间差,不能靠 CalendarLocalDateTime.now() 反复取当前时刻再减——它们受系统时间跳变、NTP校时、夏令时切换影响,会导致跳秒、停顿甚至倒流。

正确做法是:启动时调用一次 System.currentTimeMillis() 记录起始毫秒数,后续所有剩余时间都基于这个基准做减法。

  • 考试总时长(比如 60 分钟)转成毫秒:long totalMs = 60L * 60 * 1000
  • 启动倒计时瞬间记录:long startTime = System.currentTimeMillis()
  • 每次刷新时计算:long remainingMs = totalMs - (System.currentTimeMillis() - startTime)
  • 只要 remainingMs > 0 就继续,否则结束

控制台实时刷新不闪烁?用 \r 而不是 \n

直接 System.out.println("剩余: 59s") 每次都换行,控制台会滚屏,看不出“倒计时感”。真正干净的刷新是覆盖本行——靠回车符 \r 回到行首,再输出新内容,末尾加空格覆盖残留字符。

注意 Windows 和 Linux 终端对 \r 支持一致,但别混用 \r\n,否则可能多出空行。

立即学习Java免费学习笔记(深入)”;

Stable Diffusion Online
Stable Diffusion Online

基于Stable Diffusion搭建的AI绘图工具

下载
  • System.out.print("\r剩余时间: " + seconds + "s ");(末尾空格很重要)
  • 首次输出后,记得调用 System.out.flush(),否则可能缓冲不显示
  • 不要用 Scanner 在倒计时中阻塞读取,会卡住刷新;如需中途退出,改用非阻塞方式或另起线程监听

时间偏移怎么算?别碰 TimeZoneSimpleDateFormat

用户说的“时间偏移”,通常是指考试系统部署在服务器(比如 UTC+0),而考生本地是 UTC+8,想让倒计时按考生本地时间开始。但控制台程序跑在谁的机器上,就该用谁的系统时间——强行转换时区只会引入 ZoneId.systemDefault() 以外的歧义。

真正需要偏移的场景只有一种:考试开始时间由服务端统一指定(如 “2024-05-20T14:00:00+0800”),客户端要算出本地毫秒差。这时必须用 Instant + ZonedDateTime 解析,而不是字符串截取或手动加减小时。

  • 解析服务端给的 ISO 时间字符串:ZonedDateTime examStart = ZonedDateTime.parse("2024-05-20T14:00:00+08:00")
  • 转成本地时区的毫秒:long startMs = examStart.withZoneSameInstant(ZoneId.systemDefault()).toInstant().toEpochMilli()
  • 别用 Calendar.setTimeZone(),它不改变已有的 getTimeInMillis() 结果,容易白忙活

为什么 Thread.sleep(1000) 会越来越慢?

while 循环 + Thread.sleep(1000) 做秒级刷新,看似简单,实际误差会累积。因为 sleep 不保证精确唤醒,JVM 调度、GC、系统负载都会导致某次休眠变成 1020ms 或 1050ms,几轮下来就慢了 3–5 秒。

更稳的做法是:每次循环都重新计算「下一次该更新的时间点」,然后 sleep 到那个时刻,而不是固定间隔。

  • 记录下次刷新目标时间:long nextTick = System.currentTimeMillis() + 1000
  • 循环内:long sleepMs = Math.max(0, nextTick - System.currentTimeMillis())
  • Thread.sleep(sleepMs),然后立刻更新 nextTick += 1000
  • 这样即使某次 sleep 延迟了,下一次会自动追回来,整体节奏紧贴真实秒表

控制台倒计时最麻烦的从来不是写几行代码,而是默认以为“时间就是现在看到的那个数字”——可操作系统里的“现在”,其实是个随时可能被修正的近似值。真要准,就得锚定一个起点,全程只算差值,其他都得让路。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

105

2023.09.25

java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

325

2024.02.29

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

739

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号