java - 独立于系统日期和时间的java时钟

标签 java clock

我的应用程序将收到的 UDP 数据包存储在文件中,并存储每个数据包的接收时间以及每个数据包。我正在使用 System.currentTimeMillies() 来获取接收数据包时的接收时间。

我需要存储时间,因为当我在 UDP 上传输此文件时,我将从文件传输每个数据包,并与为每个数据包存储的时间同步。

问题是,如果我在接收和存储数据包时更改系统日期和时间,则发送文件时的同步会变得困惑。

所以我需要独立于系统日期和时间为每个接收到的数据包添加时间戳。这样在发送时,即使在接收时更改了系统日期和时间,发送速率也会同步。

我知道这些可以通过 System.nanoTime() 实现,但是使用它安全吗?我认为 System.nanoTime() 在不同的系统架构和操作系统上可能不准确。

此外,如果我使用 System.nanoTime(),这个时钟将如何启动(初始值),因为我不希望它在程序运行时以最后一个值结束。如果从第一次调用 System.nanoTime() 开始,时钟从 0 开始,这个时钟可以运行大约 290 年,然后以最后一个值结束。

是否有替代 System.nanoTime() 的方法?我需要以毫秒为单位的时钟精度。

我还需要这个时钟独立于系统运行,因为我可能正在从其他机器传输文件。此外,它不应将时间偏移数天或数月,绝不应在不同系统之间。

谢谢

最佳答案

System.nanoTime() 是(在 JDK 中)获取在系统日期更改时不会更改的日期的唯一方法。

要处理溢出(假设您的系统运行时间少于 290 年),请使用任意起点并存储差异:

public static final long START = System.nanoTime();

//when receiving packet:
long date = System.nanoTime();
packet.setTimestamp(date - START);

关于java - 独立于系统日期和时间的java时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672649/

相关文章:

java - Spring Boot pom - 如何从聚合器 pom 继承配置文件和属性?

macos - 在 OS X 上以编程方式检测当前 CPU 时钟速度?

c - 内核启动和执行之间的平均时间?

vb.net - VB中如何显示时间的毫秒数

javascript - 同步客户端和服务器端时间

c# - await Task.Delay 超过 15 ms 等待的时间不够长

java - 如何在 Spring 中将属性的 HashMap 传递给 Autowiring 的 bean?

java - 从Java 8对象列表中获取具有最大日期属性的对象

java - 从 ArrayList<String> 获取随机项

java - ParseDate 无法解析