时钟在java中独立于系统日期和时间

时间:2013-09-07 11:06:58

标签: java clock

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

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

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

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

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

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

System.nanoTime()有替代方案吗?我需要精确的时钟,以毫秒为单位。

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

由于

1 个答案:

答案 0 :(得分:1)

System.nanoTime()是获得日期的唯一方式(在JDK中),如果系统的日期发生变化,该日期不会改变。

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

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

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