Что случилось с этим странным сохранением даты BSON? - PullRequest
0 голосов
/ 03 ноября 2019

Я сейчас пишу драйвер для MongoDB, поэтому мне нужно копнуть немного глубже, и я нахожу это:

Спецификация BSON для DateTimeUTC:

"\x09" e_name int64

Спецификация BSON для int64:

"\x12" e_name int64

Спецификация BSON для timeStamp (хотя я знаю, что он почти всегда используется внутри, просто для того, чтобы показать, что BSON использует целые числа без знака):

"\x11" e_name uint64

Это кажется мне немного спорным. Почему int64 и utc millis даже разделены? Использует ли mongoDB разные способы сравнения разных BSON dateTimeUTC?

И почему dateTimeUTC - это не uint64, а целое число со знаком? миллис всегда> 0. Есть ли причина этого? Я что-то упустил?

1 Ответ

1 голос
/ 04 ноября 2019

DateTimeUTC используется для представления момента времени. Это предшествует BSON, и исторически использовало целое число со знаком. Это позволяет использовать DateTimeUTC для указания даты до эпохи. В противном случае будет невозможно представить даты до 1970-01-01 с использованием DateTimeUTC.

В отличие от этого, отметка времени предназначена главным образом для внутреннего использования и, как ожидается, будет использоваться в основном для текущих дат, в которых нет особой необходимостидля представления времени до эпохи (например, метка времени операции).

В UNIX StackExchange есть связанный вопрос, касающийся этого: Почему Unix хранит метки времени в целом числе со знаком?

...