我有应用程序将收到的UDP数据包存储在文件中,并存储每个数据包的接收时间以及每个数据包。我正在使用System.currentTimeMillies()
来获取收到数据包的时间。
我需要存储时间,因为当我在UDP上传输此文件时,我将从文件传输每个数据包,与为每个数据包存储的时间同步。
问题是,如果我在接收和存储数据包时更改系统日期和时间,发送文件时的同步就会搞砸。
因此,我需要为每个接收的数据包加上时间戳,而与系统日期和时间无关。因此,在发送时,即使系统日期和时间在接收时发生变化,发送速率也将同步。
我知道这些可以通过System.nanoTime()
来实现,但使用它是否安全?我认为System.nanoTime()
在不同的系统架构和操作系统上可能不准确。
另外,如果我使用System.nanoTime()
,这个时钟将如何启动(初始值),因为我不希望它在程序运行时以最后一个值结束。如果第一次调用System.nanoTime()
时钟从0开始,则此时钟可以运行大约290年,然后以最后一个值结束。
System.nanoTime()
有替代方案吗?我需要精确的时钟,以毫秒为单位。
此外,我需要这个时钟独立于系统运行,因为我可能正在从其他机器传输文件。此外,它不应该在几天或几个月内扭曲时间,也不应该在不同系统之间。
由于
答案 0 :(得分:1)
System.nanoTime()
是获得日期的唯一方式(在JDK中),如果系统的日期发生变化,该日期不会改变。
要处理溢出(假设您的系统运行时间少于290年),请使用任意起点并存储差异:
public static final long START = System.nanoTime();
//when receiving packet:
long date = System.nanoTime();
packet.setTimestamp(date - START);