【问题标题】:Clock in java independent of system date and timejava中的时钟独立于系统日期和时间
【发布时间】:2013-09-07 11:06:58
【问题描述】:

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

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

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 为什么不把发送日期放在你的UDP数据包里?
  • 发送 UDP 的应用程序不在我的控制范围内。我无法修改该应用程序。

标签: java clock


【解决方案1】:

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

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

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

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

【讨论】:

  • System.nanoTime() 在不同的机器上是否准确?因为我可能是从不同的机器发送文件,而不是从哪个文件创建的。
  • 程序可能会运行几个月以从任何机器发送文件。所以,我需要完美的时钟。
  • 否 System.nanoTime 是特定于机器的。如果你需要一个“完美的时钟”,你可以依赖 NTP 服务器。或者,如果重要的是数据包的顺序,您可以简单地让服务器提供一个自动递增的 id。
  • NTP 服务器不能作为解决方案,我需要精确到毫秒。我需要时间戳来同步接收文件时的传输速率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多