В DateTime используются только 62 из 64 бит.Отрицательные значения не в спецификации.Как я представляю даты до нашей эры? - PullRequest
3 голосов
/ 14 апреля 2019

Использование VB.NET:

Debug.Print(DateTime.MinValue.ToString)
Debug.Print(DateTime.MaxValue.ToString)
Debug.Print(DateTime.MinValue.Ticks.ToString)
Debug.Print(DateTime.MaxValue.Ticks.ToString)

Я получаю:

01-01-0001
31-12-9999
0
3155378975999999999

Максимальное значение в двоичных значениях 0010 1011 1100 1010 0010 1000 0111 0101 1111 0100 0011 0111 0011 1111 1111 1111‬.

Всего 62 из 64 битбыли использованы.

(1) Почему MSB не использовался для предоставления дат, легко доходящих до 10000 г. до н.э.?

(2) Эти 2 бита зарезервированы для чего-то, о чем я не знаю?

(3) Чтобы назначить даты до нашей эры и выполнить с ними арифметику, у меня нет другого выбора, кроме как определитьновый тип данных?

1 Ответ

4 голосов
/ 14 апреля 2019

Два старших бита используются для «вида»:

  • Местное
  • UTC
  • Не выбрано
  • "Местный со специальными знаниями для неоднозначных случаев"

См. мой блог для получения дополнительной информации об этом . По общему признанию, "вид" был введен только в .NET 1.1 (IIRC); Я подозреваю, что предел диапазона до этого был просто вопросом прагматизма. Существуют всевозможные практические проблемы, которые возникают, когда вы решаете обрабатывать значения ранее, чем 0001-01-01, и я подозреваю, что разработчики .NET считают, что эти проблемы повредят больше разработчиков, чем число разработчиков, которым нужно больший диапазон дат.

С точки зрения того, как обращаться с более ранними датами, я настоятельно рекомендую против написание собственного кода даты / времени, если только вам это не нужно. Я бы лично порекомендовал свою библиотеку Noda Time . обрабатывает даты в диапазоне [9999BC, 9999AD], а также обладает точностью до наносекунды по времени и поддерживает базу данных часовых поясов IANA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...