Если бы я хотел работать, используя даты и время, уходящие миллионы лет в прошлое / будущее, как бы я это сделал?
Если бы я хотел работать с датами и временем, уходящим на миллионы лет в прошлое / будущее, как бы я делал это в C/C++/C#?
Например, скажем, я работал над алгоритмом, чтобы посмотреть, ударит ли комета по земле? Существуют ли коммерческие или открытые библиотеки, которые делают это?
Большинство значений DateTime работают только в течение нескольких лет. Юниксы закончатся только в 2038 году!.
Тони
9 ответов
Астрономы используют свой собственный календарь, отличный от гражданского, григорианского календаря.
Астрономические Юлианские Даты - это то, что они используют.
Посмотрите на http://en.wikipedia.org/wiki/Julian_day
Вот типичная упаковка: Солнечные часы.
Вы не можете определить будущие даты UTC до второй из-за наличия дополнительных секунд (одна из которых запланирована на 31 декабря, через пару недель). Никто не знает, когда в календарь будут добавлены високосные секунды, потому что никто не знает, с какой скоростью вращение Земли будет продолжать замедляться в будущем.
Ну, не для того, чтобы быть тупым или что-то в этом роде, но если он ударит по земле примерно через 1700 лет, я не думаю, что нам нужно знать фактическую дату.
Если это не вторник.
Никогда не мог освоиться во вторник.
Если промежуток времени, предлагаемый типичными переменными даты и времени, слишком мал, у вас есть два варианта:
- Использование переменной с большей областью действия (т.е. с большим количеством битов)
- Принимая во внимание меньшую точность
Какой из них выбрать, зависит от того, что именно вы хотите сделать. Но в целом мой совет - вариант № 2. Когда мы говорим о веках или тысячелетиях, миллисекунды обычно не так важны...
Когда дело доходит до астрономических событий, не имеет значения, какая часть земли обращена к Солнцу, т.е. имеет дневной свет. Поэтому календари и даты тоже не имеют значения. Вы должны просто использовать время. Например, 64-битного time_t вполне достаточно.
Даже когда вы используете время, имейте в виду, что системы из трех тел (например, Земля-Солнце-Юпитер) хаотичны. Прогнозирование положения Земли в далеком будущем имеет довольно большой предел погрешности.
Я думаю, что проблема не в том, ударит ли комета в пятницу или воскресенье, а в том, ударит комета или нет. Я предполагаю, что это означает, что вы могли бы смоделировать время с точностью до 1000-х секунд как тип длиной 64 бита. Вы можете решить 213 миллиардов лет. Затем вы можете иметь подпрограмму, которая сопоставляет это значение со значениями полной даты...
Вам просто нужно больше битов для хранения значения и / или использования больших приращений времени для представления временной меткой. Вместо ms делайте годы, затем, возможно, используйте математическую библиотеку /API, разработанную для очень больших чисел, если этого недостаточно (и в зависимости от ваших требований к точности), или используйте с плавающей запятой.
Объект DateTime в C# перемещается с 1.1.0001 по 12.31.9999. Он еще более ограничен в SQL Server, где самая ранняя дата - что-то вроде 1735 года.
Вам в значительной степени придется написать что-то самостоятельно или попытаться отобрать что-то у кого-то другого. Продвигаться вперед, вероятно, проще (за исключением второго шага). Здесь есть довольно хорошая информация о календарях.