Java--System.currentTimeMillis()获取时间,并计算代码执行效率

本文介绍如何使用Java的System.currentTimeMillis()方法来计算代码执行时间,并演示了如何将毫秒时间戳格式化为易读的日期时间格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说明

System.currentTimeMillis() 方法获取的是从1970年01月01日00时00分00秒000毫秒到此刻的毫秒数返回类型是long类型。

计算一段代码执行的时间,可以通过该方法获取到起始时间结束时间,然后计算时间差,最后再进行时间单位的转换~

二、实现代码

public class Test {
public static void main(String[] args) {
	//方法第一行代码
	long startTime = System.currentTimeMillis();
	for(int i=0;i<10000;i++){
		System.out.println(i);
	}
	//方法最后一行代码
	long endTime = System.currentTimeMillis();
	//long类型时间差,单位毫秒
	long timeLong = endTime - startTime;
	//long类型时间差转为double类型时间差,单位毫秒
	double timeDouble= Double.parseDouble(Long.toString(timeLong));
	System.out.println("该方法执行时间为" + timeDouble+ "毫秒,即" + timeDouble/(double)1000 + "秒");
	}
}

三、格式化时间戳

System.currentTimeMillis()获取到的系统时间单位是毫秒,可以通过SimpleDateFormat格式化为yyyy-MM-dd HH:mm:ss格式,如2017-12-09 12:12:12

Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowSystemTime = sdf.format(date);
System.out.println("当前系统时间为" + nowSystemTime);

<think>首先,用户的问题是:“我想了解System.currentTimeMillis()是否提供秒级精度请问javaSystem.currentTimeMillis()秒级精度”。翻译成英文是:“IwanttoknowifSystem.currentTimeMillis()providessecond-levelaccuracy.PleaseaskaboutJavaSystem.currentTimeMillis()second-levelaccuracy.”从系统级指令中,我需要遵循规则:1.所有行内数学表达式使用$...$格式。2.独立公式使用$$...$$格式单独成段。3.LaTeX语法正确。4.使用中文回答。5.生成相关问题。6.回答中引用的段落末尾自然地添加引用标识。用户可见层:回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。参考站内引用:有多个引用,我需要基于这些提供准确信息。关键引用:-[^1]:System.currentTimeMillis()返回毫秒级时间戳,但不保证精度。-[^2]:示例代码展示如何使用它测量时间-[^3]:描述了问题:精度不高(毫秒级),受系统时间调整影响。-[^4]:总结其特点和适用场景。-[^5]:System.nanoTime()提供更高精度(纳秒级)。用户的问题是:System.currentTimeMillis()是否提供秒级精度?分析:-System.currentTimeMillis()返回自1970年1月1日00:00:00UTC以来的毫秒数(即Unix时间戳)。所以,它的单位是毫秒,这意味着它理论上可以提供毫秒级精度。-但精度取决于操作系统和硬件。在大多数系统中,它可能只有毫秒级或更低的精度,比如10-15毫秒的间隔。-秒级精度意味着精确到秒。由于它返回毫秒值,所以它可以轻松提供秒级精度,因为你可以除以1000来得到秒数。-引用[^1]说:“在Java中可以通过System.currentTimeMillis()或者System.nanoTime()方法获得当前时间的精确值。但是通过阅读Javadoc,我们发现这两个方法不一定保证得到你所期望的精度。”具体到System.currentTimeMillis(),它提到精度不高。-引用[^3]说:“精度不高:只能提供毫秒级的精度。”所以,它提供毫秒级分辨率,但实际精度可能更低。因此,回答应该是:是的,System.currentTimeMillis()提供秒级精度,因为它返回毫秒值,你可以通过除以1000得到秒数。但实际精度取决于系统。结构清晰的回答:1.解释方法:System.currentTimeMillis()返回当前时间与Unix纪元之间的毫秒数。2.回答精度:它提供毫秒级分辨率,所以可以用于秒级精度(通过除法)。3.讨论限制:实际精度可能受系统影响,比如在Windows系统上可能只有15毫秒的精度。4.与nanoTime()对比:如果需要更高精度,使用System.nanoTime()。5.添加引用:在相关部分添加引用标识。生成相关问题:基于主题生成3个相关问题。使用中文回答。数学表达式:用户问题中没有数学部分,但如果有时间计算,可能涉及除法。例如,要得到秒数:$\text{秒数}=\frac{\text{millis}}{1000}$。所以,在回答中如果需要,使用行内LaTeX。最终回答结构:-引言:直接回答问题。-详细解释。-示例代码(如果需要)。-总结。-相关问题。</think>### Java System.currentTimeMillis() 的秒级精度分析 System.currentTimeMillis()Java 中用于获取当前时间戳的方法,它返回自 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)以来的毫秒数。以下我将逐步分析它是否提供秒级精度,解释其特性和限制,确保回答基于 Java 官方文档和实际应用场景。 #### 1. **System.currentTimeMillis() 是否提供秒级精度?** - **是的,它可以提供秒级精度**,但这不是直接提供的,而是通过简单的数学转换实现。 - 该方法返回的是一个长整型值(单位为毫秒),例如返回 `1718901234567` 表示 1718901234.567 秒(即从纪元开始的毫秒计数)。 - 要获得秒级精度的时间戳,您可以将返回值除以 1000: $$ \text{秒级时间戳} = \frac{\text{System.currentTimeMillis()}}{1000} $$ 这会将毫秒转换为秒(小数部分表示毫秒内的时间,但整数部分即为秒级精度)。 - 例如,在代码中实现: ```java long millis = System.currentTimeMillis(); // 获取毫秒值 long seconds = millis / 1000; // 转换为秒级精度 System.out.println("当前秒级时间戳: " + seconds); ``` - **为什么说它“提供”秒级精度?** - 由于返回值的分辨率是毫秒(1 毫秒 = 0.001 秒),理论上它可以精确到秒级。例如,通过上述除法,您可以准确获取整数秒数。 - 实际应用中,这在需要记录事件时间(如日志时间戳或简单计时)时足够可靠,且效率高[^4]。 #### 2. **精度限制和注意事项** 虽然 System.currentTimeMillis() 可用于秒级精度,但它存在一些限制,可能影响高精度场景: - **精度问题**:方法名义上提供毫秒级分辨率,但实际精度取决于操作系统和硬件: - 在 Windows 系统上,精度可能仅为 15-16 毫秒(受系统时钟中断影响);在 Linux 上可能达到 1 毫秒,但不保证始终精确[^1][^3]。 - 这意味着秒级转换(如 `millis / 1000`)在大多数情况下是可靠的,但如果系统时钟调整(如 NTP 同步或手动更改时间),返回值可能出现跳跃,导致秒级时间戳不连续[^1][^3]。 - 示例:如果系统时间被调整,测量代码执行时间时可能出错: ```java long startTime = System.currentTimeMillis(); // 开始时间 Thread.sleep(1000); // 模拟耗时操作 long endTime = System.currentTimeMillis(); long durationSeconds = (endTime - startTime) / 1000; // 秒级耗时 System.out.println("耗时秒数: " + durationSeconds); // 可能不准确 ``` - **与 System.nanoTime() 的对比**: - 如果您需要更高精度(如微秒或纳秒级),或避免系统时间调整的影响,推荐使用 System.nanoTime()。它返回纳秒级时间戳(基于系统计时器),更适合测量短时间间隔[^5]: ```java long startNano = System.nanoTime(); // 纳秒级开始时间 // 执行代码... long endNano = System.nanoTime(); long durationMillis = (endNano - startNano) / 1_000_000; // 转换为毫秒 ``` - 但注意:System.nanoTime() 不适用于获取“绝对时间”(如日历时间),只适合相对时间测量[^5]。 #### 3. **适用场景总结** - **推荐使用 System.currentTimeMillis() 的场景**: - 需要秒级或毫秒级的绝对时间戳(如记录事件时间、生成时间相关的 ID)。 - 简单计时任务(如测量大于 100 毫秒的代码执行时间),且对精度要求不高时。 - **不推荐使用的场景**: - 微基准测试(microbenchmarking)或需要纳秒级精度的测量。 -系统时间可能被外部调整时(如分布式系统同步)。 - 总体而言,System.currentTimeMillis() 是高效且易用的,适用于大多数通用编程任务,但开发者需根据需求权衡精度限制[^4][^1]。 #### 相关问题 基于本主题,以下是您可能感兴趣的相关问题: 1. 如何避免 System.currentTimeMillis()系统时间调整的影响? 2. 在分布式系统中,如何实现高精度时间同步? 3. System.nanoTime() 在哪些场景下比 System.currentTimeMillis() 更优?
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吾日三省贾斯汀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值