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