gpt4 book ai didi

unix-timestamp - 我应该对 Unix 时间进行多精确的编码?

转载 作者:行者123 更新时间:2023-12-04 10:59:52 32 4
gpt4 key购买 nike

我遇到了这个问题,因为我正在跨多个平台处理时间,并且似乎它们在他们的系统中如何实现和/或处理 unix 时间方面都略有不同。因此问题。

报价 Wikipedia page on Unix Time :

Unix has no tradition of directly representing non-integer Unix time numbers as binary fractions. Instead, times with sub-second precision are represented using composite data types that consist of two integers, the first being a time_t (the integral part of the Unix time), and the second being the fractional part of the time number in millionths (in struct timeval) or billionths (in struct timespec). These structures provide a decimal-based fixed-point data format, which is useful for some applications, and trivial to convert for others.



这似乎是 Go (UnixNano) 中的实现。然而,在实践中,有许多语言/平台使用毫秒(Java?),有些平台使用 Float(试图保持一些精度),而其他平台主要使用 Int。

因此,如果我正在实现一种传输格式,而我只有 64 位可用于存储时间值而没有更多,我的问题有两个:
  • 我应该将它编码为整数还是浮点值?和
  • 我应该使用秒、毫秒还是纳秒精度?

  • 主要目标是尝试在尽可能多的语言和平台上尽可能准确(当然,不要在每个平台上使用自定义代码)。

    p.s.我知道这有点主观,但我相信仍然可以做出一个好的、客观的答案。如果不是这种情况,请随时关闭。

    最佳答案

    这取决于时间值所需的精度是多少,以及它的最大范围。

    当以无符号 64 位整数存储纳秒时,范围约为 584 年(2^64 ns),对于任何实际应用来说已经足够精确和长了。

    使用浮点格式的优点是可以存储非常小和非常大的值,对于较小的值具有更高的绝对精度。但是对于 64 位,这可能无论如何都不是问题。

    如果时间值是绝对时间点而不是持续时间,则转换格式还需要定义值 0 代表的日期/时间。 (即时代)

    可以使用 gettimeofday() 获取类 UNIX 系统上的当前时间。 ,例如,它返回一个具有秒和微秒值的结构。然后可以将其转换为单个 64 位整数,给出以微秒为单位的值。 UNIX 时间的纪元是 1970 年 1 月 1 日 00:00:00 UT。 (clock() 函数不测量实时,而是测量处理器处于事件状态的持续时间。)

    当在另一个平台上生成相同传输格式的时间值时(例如带有 GetSystemTime() 的 Windows,它需要转换为相同的单位和历元。

    因此,对于传输协议(protocol),需要修复以下内容:

  • 时间值的单位(ms、us、...),取决于所需的精度和范围
  • 如果时间是时间点而不是持续时间,则纪元(日期和时间值为 0)
  • 是否存储为整数(无符号或有符号,如果它是可以为负数的持续时间),还是作为浮点数
  • 64位值的字节序
  • 如果使用浮点,浮点值的格式(通常为 IEEE 754)

  • 因为不同平台有不同的 API 来获取当前时间,可能总是需要一些代码来正确转换时间值,但这很简单。

    关于unix-timestamp - 我应该对 Unix 时间进行多精确的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56127637/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com