【问题标题】:What is the least number of bytes for representing date and time?表示日期和时间的最少字节数是多少?
【发布时间】:2009-12-29 02:38:11
【问题描述】:

我需要通过 TCP/IP 将当前操作系统的日期和时间从甲方传输到乙方,精确到微秒。

  • 最少的字节数是多少 可以用来表示这个 不牺牲准确性?

  • 以及如何转换日期和时间 到你的字节格式 使用 C#?

【问题讨论】:

    标签: c# datetime date time byte


    【解决方案1】:

    从某个固定时间点开始,最少的位数将使用微秒。但是当你这样做时,在未来的某个时候你的时间戳会溢出。

    例如,如果您选择昨天的固定时间点。那么 5 个字节就足以编码从昨天到下周中旬的时间。

    但这似乎不必要地复杂。 DateTime.Tick 仅使用 8 个字节的空间。它精确到 1/10 微秒,跨越所有有记录的人类历史,它引用了一个定义的时间点(第 1 年 1 月 1 日),最重要的是,它的标准

    【讨论】:

    • 为了使用DateTime.Tick,我需要选择一个固定的时间点对吗?选择这个固定时间点有标准吗?
    • @Lopper,不,您不需要选择固定时间点。 System.DateTime 已经为您完成了。
    • 波特曼说的。如果你不使用标准的,你只需要选择一个时间点。
    • 标准?我们不相信标准——我们在这家公司创造了我们自己的时间!!
    • 我投票支持 1984 年 1 月 17 日。第一个 Macintosh Commercial 的发布日期。
    【解决方案2】:

    DateTime.Tick 是日期时间的二进制格式表示

    【讨论】:

      【解决方案3】:

      显然 DateTime.Ticks 可以表示从 0001 年开始到纳秒级别的时间。根据上面的海报,它需要 8 个字节的空间。

      但是,要获得从 0000 年到 9999 年所有微秒的最小表示,您可以按如下方式计算:

      9999 年 * 365 天 * 24 小时 * 60 分钟 * 60 秒 * 1000000 微秒 = 525547400000

      ln(以上数字) / ln(2) = 52.22274 .. -- 53 位

      53 位 = 6.5 字节。

      因此,您可以通过使用非标准表示来保存一个字节(基本上您可以通过不必表示纳秒来保存)。

      编写转换例程很简单。只需将每个日期、时间、毫秒转换为 0000 年初和 9999 年之间的适当毫秒。要再次获取日期时间,只需进行反向计算。这很简单,您应该能够弄清楚。

      但是,我非常怀疑节省 1 个字节是否值得工作、潜在的错误、非标准化、维护、文档等等等。

      【讨论】:

      • 次要点,DateTime.Tics 精确到 100 纳秒,或 1/10 微秒。不精确到纳秒
      • 请检查数学:9999 * 365 * 24 * 60 * 60 * 1000000 == 315328464000000000
      【解决方案4】:

      如果您总是包括微秒,则最好使用已经讨论过的固定字节数 - 但是,如果这是通用序列化,您可能想要利用许多常规值具有日期或小时值的事实。对于 protobuf-net,它标记刻度(天、小时、分钟、秒、毫秒或滴答声)并发送给定时间和任意纪元(1970 年 1 月 1 日)之间的 [whatever] 的整数。为了进一步减少这种情况,整数以可变长度编码传递,允许非常方便地传递最常见的值。这使它能够以最少的字节数发送日期值等内容。

      【讨论】:

        【解决方案5】:

        我不得不对 Larry Watanabe 的回答提出异议。

        实际上,您可以使用 单个 字节来表示以微秒为单位的时间。您只能表示纪元开始后 255 微秒内的时间,这可能是也可能不是重大限制,具体取决于您的其他要求。

        【讨论】:

          【解决方案6】:

          答案:无限的字节数。

          原因:请参阅 John Knoeller 的回答。基本上,如果您选择任何有限数量的位,那么它只能表示有限数量的时间点。由于时间无限延伸到过去和未来,它无法及时表示一些(实际上是无限数量的)实例。

          这将是一个很好的面试问题:)

          【讨论】:

          • 不一定是无限的,距离大爆炸只有大约 14 G 年,我们不知道我们会持续多久。尽管如此,我还是给了你+1!
          • 时间是一个连续变量,因此在任何时间跨度中都有无穷多个时刻。
          • @Doug Currie - 您假设此应用程序仅引用历史中的实际时间,而不是无限的未来。这可能是一个天文学应用程序,试图计算数十亿年后的恒星位置。
          猜你喜欢
          • 1970-01-01
          • 2019-05-04
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-17
          • 2023-03-05
          • 2020-12-15
          相关资源
          最近更新 更多