2015-07-17 2 views
1

Я пытаюсь обрабатывать данные интервала времени. Данные имеют два формата:Как представить геологическое время? (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 для представления такого масштаба? Мой поиск привел к выводу «нет», и в этом случае мы просто напишем собственный класс.

+0

Это типичный компромисс между компьютером: точность против диапазона и потребляемая память. Если бы я был вами, я бы использовал структуру/класс, у которой есть int32 года с тех пор, как происходило (1950 год - популярный во многих геофизических контекстах) и time_t или int или что-то еще, что имеет секунды с начала года. – wallyk

+1

Спросите разработчика Ruby. –

+0

Я не знаю, в чем проблема. Вы не можете использовать двойной? Обычно секунды и минуты становятся менее интересными при измерении в течение десятилетий, но даже это не должно быть проблемой: даже в самом большом масштабе (7e8) ['double' должен оставлять значимые цифры для представления интервалов ~ 3 с.] (Http: //coliru.stacked-crooked.com/a/f0d628a07bfd19e2) – sehe

ответ

2

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

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

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

  • Грегорианский календарь определяется с 15 октября 1582. Обратите внимание, что до 1930 года в некоторых странах использовался gregorian календарь, а некоторые еще юлианский, переход в результате чего составлял interesting facts, например, отсутствие 13 сентября 1752 года в Англии и Америке.

  • Прежде, чем это был юлианский календарь, определенный J.Caesar в 45 году до нашей эры. Обратите внимание, что в то время как формат, число месяцев и длина месяца такие же, как и в gregorian calendar, разница между ними составляет 13 дней, которые учитывают накопленные различия за эти годы.

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

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

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

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

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).

+0

Спасибо, Кристоф. Это было полезно при разработке соображений при разработке класса, который может обрабатывать как узкое, так и масштабное время. – jslmsca