Как изобразить геологическое время? (Boost, Date_time?)

Я пытаюсь обработать данные интервала времени. Данные имеют два формата:

1) каждый интервал установлен явно (например, 1982-12-31, 1988-01-01T00: 00: 00);

или же

2) устанавливается начальная дата, за которой следуют смещения секунд, минут, часов, дней, месяцев или лет

Я использовал комбинацию boost::gregorian::date а также boost::posix_time::ptime чтобы управлять этим, и использовать средства, чтобы получить красиво отформатированные строки. Тем не менее, теперь мне предоставили данные, которые охватывают 1,9 миллиона лет, причем каждый временной шаг составляет примерно 10 лет. Дата начала — 0, а последний интервал — 7e8. Очевидно, я достиг предела.

Есть ли способ использовать Boost для представления такого масштаба? Мой поиск привел к выводу «нет», и в этом случае мы просто напишем наш собственный класс.

1

Решение

Это очень интересный вопрос. Но достижение пределов повышения в этой области требует тщательного обдумывания риска выхода за пределы астрономических пределов сегодняшнего дня.

Календари и даты очень относительны:

  • Время Posix определяется как время, прошедшее с 1 января 1970 года, не считая високосных секунд. boost позволяет выбирать между микросекундным или наносекундным разрешением во время сборки.

  • Григорианский календарь определяется с 15 октября 1582 года. Обратите внимание, что до 1930 года в некоторых странах использовался григорианский календарь, а в некоторых по-прежнему Юлианский, в результате чего переход интересные факты, такие как отсутствие 13 сентября 1752 года в Англии и Америке.

  • До этого был юлианский календарь, определенный Я. Цезарем в 45 г. до н. Обратите внимание, что хотя формат, число месяца и длина месяца совпадает с григорианским календарем, разница между ними составляет 13 дней, которые учитывают накопленные различия за эти годы.

  • до 45 г. до н.э. существовал старый римский календарь, в котором было 355 дней в году.

  • И задолго до того, как человечество начиналось, наверняка существовали всевозможные другие календари. Но дни не всегда были 24 часа. Изменения от 1 до 3 микросекунд в день солнечный день сложите, если вы идете в миллионы лет. Например, 600 миллионов лет назад средняя продолжительность дня составляла всего 22 часа.

Если вы работаете как с геологическими, так и с узкими масштабами, проще всего использовать класс или союз, объединяющий long long (для геологического масштаба в годах до нашей эры) и boost::gregorian::date (в течение многих лет AC, если вы можете позволить себе неточность юлианский / григорианский). Хорошее форматирование тогда было бы относительно легко организовать.

В качестве альтернативы вы можете рассмотреть возможность использования хроно с самым длинным целочисленным типом и отношением, указывающим, что вы будете считать годы:

typedef chrono::duration<long long, ratio<31556926, 1>> duration_in_year;
duration_in_year d2(1900000); // 1,9M years
chrono::time_point<chrono::system_clock> t1 = chrono::system_clock::now() - d2;

но приятная распечатка не будет так очевидна, как с надписью. И вам придется определить свой собственный класс часов (приведенный выше пример будет работать с 1,9 млн. Лет, но не намного, из-за параметров, используемых для создания экземпляра system_clock учебный класс).

2

Другие решения


По вопросам рекламы [email protected]