这个奇怪的 BSON 日期保存是怎么回事?

What is up with this wierd BSON date saving?

我目前正在为 MongoDB 编写一个驱动程序,所以我必须更深入地挖掘,所以我发现了这个:

DateTimeUTC 的 BSON 规范:

"\x09" e_name int64

int64 的 BSON 规范:

"\x12" e_name int64

时间戳的 BSON 规范(虽然我知道它几乎总是在内部使用,它只是为了表明 BSON 使用无符号整数):

"\x11" e_name uint64

我觉得有点争议。为什么 int64 和 utc millis 甚至分开? mongoDB 是否使用不同的方式来比较不同的 BSON dateTimeUTC?

为什么 dateTimeUTC 不是 uint64 而是有符号整数?毫秒总是 > 0。这背后有什么原因吗?我错过了什么吗?

DateTimeUTC 用于表示时间点。它早于 BSON,并且在历史上一直使用有符号整数。这是为了使 DateTimeUTC 能够指向 之前 纪元的日期。否则,将无法使用 DateTimeUTC 表示 1970-01-01 之前的日期。

相比之下,时间戳主要供内部使用,预计主要用于几乎不需要表示纪元之前的时间的当前日期(例如,操作的时间戳)。

UNIX StackExchange 中有一个与此相关的问题:Why does Unix store timestamps in a signed integer?