2

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

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

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

因此,我需要为每个接收到的数据包加上时间戳,而与系统日期和时间无关。这样在发送时,即使系统日期和时间在接收时发生变化,发送速率也会同步。

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

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

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

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

谢谢

4

1 回答 1

1

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

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

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

//when receiving packet:
long date = System.nanoTime();
packet.setTimestamp(date - START);
于 2013-09-07T11:23:32.963 回答