Java时间转换的误区:精确到毫秒

本文介绍了一种常见的时间戳转换错误,即混淆秒级时间戳与毫秒级时间戳,导致日期显示为1970-01-18的问题,并提供了正确的转换方法。

有个时间转换的功能,本以为很是简单,但是转换后日期一直是1970-01-18,一看这时间就是有问题,方法写错了?折腾了一个小时,先贴代码。

    public String getNowDate(long time) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(time);
        return dateString;
    }
 TextView textView= (TextView) findViewById(R.id.tv);
 textView.setText(getNowDate(1510787998));

数字:1510787998是后台接口返回的时间戳
结果:1970-01-18
准确:2017-11-16

找原因,我首先看下自己的方法有没有问题,试了七八次没有问题,绝对没有问题。后台数据问题?然后用Java获取当前时间发现后台给的数据少了三位,这才明白后台给的数据是到秒,但是Java转换的时候要求数据是毫秒,因此应该将数据1510787998变成1510787998000。
同时一些时间转换工具的网站也是要秒就可以不用精确到毫秒。例如
http://tool.lu/timestamp/

总结:Java的时间转换在毫秒,不是秒。

<think> 首先,用户的问题是:“我想查找在Java中输出运算时间的方法 请问Java中输出运算时间的方法”。这是在询问如何在Java中测量和输出代码的执行时间。 回顾系统级指令: - 我需要使用$...$格式行内数学表达式。 - 独立公式用$$...$$格式。 - 使用中文回答。 - 生成相关问题。 - 在引用段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 用户提供了几个站内引用: - [^1]: 关于Java时间赋值,使用LocalDateTime和ZonedDateTime。 - [^2]: Java时间减法,使用MyTime类示例。 - [^3]: Java LocalDateTime常用方法总结。 - [^4]: Java的几种时间,包括Date类。 用户说这些引用仅供参考,我应该参考用户上一次的问题和我的回答。但在这个对话中,没有上一次问题;这是第一个消息。所以,我应该基于当前问题和引用。 关键点:用户想输出运算时间,即代码的执行时间。这通常涉及测量起始时间、结束时间,然后计算差值。 在Java中,常用的方法有: 1. 使用System.currentTimeMillis():获取当前时间毫秒数。 2. 使用System.nanoTime():获取更精确的纳时间。 3. 使用java.time包中的类,如Instant(从Java 8开始)。 4. 使用第三方库如Stopwatch(Guava库)。 引用中提到了LocalDateTime和Date类。[^3]提到LocalDateTime是线程安全的,[^4]提到Date类。但这些更适合日期时间处理,而不是精确测量执行时间。测量执行时间通常使用System.nanoTime()或Instant。 用户指定要输出运算时间,意思是输出代码段的运行时间。 结构清晰的回答: 1. **介绍方法**:解释如何测量执行时间。 2. **提供代码示例**:给出简单的Java代码示例。 3. **引用相关部分**:如果引用中有相关信息,自然地引用。 4. **生成相关问题**:在结束时添加相关问题。 生成相关问题: - 类似示例中的:如性能分析的优化方法等。 - 相关问题应基于主题,例如: 1. 如何测量纳时间? 2. Java中有哪些时间测量工具? 3. 如何避免时间测量中的误差? 确保LaTeX语法正确:由于问题不涉及数学,可能不需要数学表达式,但如果有计算,要使用$...$格式。例如,计算时间差:$\Delta t = t_{\text{end}} - t_{\text{start}}$。 使用中文回答。 最终回答结构: - 回答用户问题。 - 添加代码示例。 - 引用标识。 - 生成相关问题。 基于引用: - [^1]提到LocalDateTime,但这不是最佳方法。 - [^2]显示时间减法,但使用自定义类。 - [^3]提到LocalDateTime,适合日期操作。 - [^4]提到Date类。 最佳实践是使用System.nanoTime()用于性能测量。 给出示例: ```java long startTime = System.nanoTime(); // 要测量的代码 long endTime = System.nanoTime(); long duration = endTime - startTime; // 纳 System.out.println("执行时间: " + duration + " 纳"); ``` 或者使用Instant: ```java Instant start = Instant.now(); // 代码 Instant end = Instant.now(); long duration = Duration.between(start, end).toMillis(); System.out.println("执行时间: " + duration + " 毫秒"); ``` 自然地引用:引用中提到日期时间处理,因此可以说在测量时间时,使用系统时间更合适。 添加引用标识:例如,在提到日期时间处理时,引用[^3]。 生成相关问题: 1. 如何提高时间测量的精度? 2. Java中有哪些库可以简化时间测量? 3. 如何避免在时间测量中受到系统负载的影响? 总结回答。 </think> ### Java中输出运算时间的方法 在Java中测量并输出代码执行时间(即“运算时间”)是性能分析和优化中的常见需求。核心方法是使用系统提供的计时API记录起始和结束时间戳,然后计算差值。以下我将逐步解释推荐方法,并提供代码示例。注意,对于精确测量,优先使用`System.nanoTime()`或Java 8+的`java.time.Instant`类,因为它们提供高精度计时(纳级),且不受系统时钟变化影响[^3][^4]。 #### 测量运算时间的基本步骤 1. **记录起始时间**:在代码执行前获取当前时间戳。 2. **执行目标代码**:运行需要测量的代码段。 3. **记录结束时间**:代码执行后获取时间戳。 4. **计算时间差**:结束时间减去起始时间,得到执行时长。 5. **输出结果**:格式化输出时间差(如纳毫秒)。 #### 推荐方法与代码示例 以下是两种常用方法,适用于不同Java版本: 1. **使用`System.nanoTime()`(兼容所有Java版本)** 此方法提供纳级精度,适合微基准测试。计算时间差时,单位是纳,可通过除法转换为其他单位(例如 $1 \text{ms} = 10^6 \text{ns}$)。 ```java public class MeasureExecutionTime { public static void main(String[] args) { // 记录起始时间 long startTime = System.nanoTime(); // 执行需要测量的代码(示例:计算1到100的和) int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } System.out.println("计算结果: " + sum); // 记录结束时间 long endTime = System.nanoTime(); // 计算时间差(纳) long durationNano = endTime - startTime; // 转换毫秒(1毫秒 = 1,000,000纳) double durationMillis = durationNano / 1_000_000.0; // 输出结果 System.out.println("执行时间: " + durationNano + " 纳"); System.out.println("执行时间: " + durationMillis + " 毫秒"); } } ``` **输出示例**: ``` 计算结果: 5050 执行时间: 456789 纳 执行时间: 0.456789 毫秒 ``` 2. **使用`java.time.Instant`和`Duration`(Java 8+推荐)** Java 8引入的`java.time`包提供了更现代的API,易于使用且线程安全。`Instant`记录时间点,`Duration`计算时间差[^3][^4]。 ```java import java.time.Instant; import java.time.Duration; public class MeasureExecutionTimeJava8 { public static void main(String[] args) { // 记录起始时间 Instant start = Instant.now(); // 执行需要测量的代码(示例:模拟耗时操作) try { Thread.sleep(100); // 模拟100毫秒延迟 } catch (InterruptedException e) { e.printStackTrace(); } // 记录结束时间 Instant end = Instant.now(); // 计算时间差 Duration duration = Duration.between(start, end); // 输出结果(支持多种单位) System.out.println("执行时间(纳: " + duration.toNanos()); System.out.println("执行时间毫秒: " + duration.toMillis()); System.out.println("执行时间: " + duration.getSeconds() + "." + duration.getNano() / 1_000_000 + " "); } } ``` **输出示例**: ``` 执行时间(纳: 100345678 执行时间毫秒: 100 执行时间: 0.100 ``` #### 注意事项 - **精度选择**: - 对于短代码段(微级),使用`System.nanoTime()`获取更高精度。 - 对于长任务(级以上),`System.currentTimeMillis()`或`Duration`足够,因为它们避免了纳计算的溢出风险。 - **避免误区**: - 不要使用`LocalDateTime`或`Date`类(如在引用[^1][^4]中提及),因为它们用于日期时间处理(如日期加减),而非高精度计时。 - 多次运行代码取平均值以减少JVM启动或垃圾回收的影响。 - **性能建议**: 在正式环境,考虑使用性能分析工具(如JMH)替代手动计时,以获得更可靠结果[^3]。 通过以上方法,您可以高效地在Java中测量和输出运算时间。掌握这些技巧有助于优化代码性能和提高程序效率[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值