【发布时间】:2009-12-29 02:38:11
【问题描述】:
我需要通过 TCP/IP 将当前操作系统的日期和时间从甲方传输到乙方,精确到微秒。
最少的字节数是多少 可以用来表示这个 不牺牲准确性?
以及如何转换日期和时间 到你的字节格式 使用 C#?
【问题讨论】:
标签: c# datetime date time byte
我需要通过 TCP/IP 将当前操作系统的日期和时间从甲方传输到乙方,精确到微秒。
最少的字节数是多少 可以用来表示这个 不牺牲准确性?
以及如何转换日期和时间 到你的字节格式 使用 C#?
【问题讨论】:
标签: c# datetime date time byte
从某个固定时间点开始,最少的位数将使用微秒。但是当你这样做时,在未来的某个时候你的时间戳会溢出。
例如,如果您选择昨天的固定时间点。那么 5 个字节就足以编码从昨天到下周中旬的时间。
但这似乎不必要地复杂。 DateTime.Tick 仅使用 8 个字节的空间。它精确到 1/10 微秒,跨越所有有记录的人类历史,它引用了一个定义的时间点(第 1 年 1 月 1 日),最重要的是,它的标准
【讨论】:
DateTime.Tick 是日期时间的二进制格式表示
【讨论】:
显然 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 个字节是否值得工作、潜在的错误、非标准化、维护、文档等等等。
【讨论】:
如果您总是包括微秒,则最好使用已经讨论过的固定字节数 - 但是,如果这是通用序列化,您可能想要利用许多常规值具有日期或小时值的事实。对于 protobuf-net,它标记刻度(天、小时、分钟、秒、毫秒或滴答声)并发送给定时间和任意纪元(1970 年 1 月 1 日)之间的 [whatever] 的整数。为了进一步减少这种情况,整数以可变长度编码传递,允许非常方便地传递最常见的值。这使它能够以最少的字节数发送日期值等内容。
【讨论】:
我不得不对 Larry Watanabe 的回答提出异议。
实际上,您可以使用 单个 字节来表示以微秒为单位的时间。您只能表示纪元开始后 255 微秒内的时间,这可能是也可能不是重大限制,具体取决于您的其他要求。
【讨论】:
答案:无限的字节数。
原因:请参阅 John Knoeller 的回答。基本上,如果您选择任何有限数量的位,那么它只能表示有限数量的时间点。由于时间无限延伸到过去和未来,它无法及时表示一些(实际上是无限数量的)实例。
这将是一个很好的面试问题:)
【讨论】: