Новый ответ на старый вопрос:
chrono
-совместимые алгоритмы даты низкого уровня
имеет формулы для преобразования тройки {год, месяц, день} в последовательное число дней и обратно. Вы можете использовать его для вычисления количества дней между двумя датами, например:
std::cout << days_from_civil(2012, 4, 2) - days_from_civil(2003, 2, 2) << '\n';
который выводит:
3347
Эта статья является руководством, а не библиотекой. Он использует C ++ 14 для демонстрации формул. Каждая формула содержит подробное описание и вывод, которые вам нужно прочитать, только если вы хотите знать, как работает формула.
Формулы очень эффективны и действуют в чрезвычайно широком диапазоне. Например, используя 32-битную арифметику, +/- 5 миллионов лет (более чем достаточно).
Серийный счетчик дней - это количество дней с (или до отрицательных значений) Нового 1970 года, что делает формулы совместимыми с Unix Time и всеми известными реализациями std::chrono::system_clock
.
Алгоритм days_from_civil
не нов, и он должен выглядеть очень похоже на другие алгоритмы для того же. Но пойти другим путем - от количества дней до тройки {год, месяц, день} - сложнее. Это формула, документированная civil_from_days
, и я не видел других составов, столь же компактных, как этот.
В статье приведены примеры использования типичных вычислений , std::chrono
совместимости и обширных модульных тестов , демонстрирующих правильность в течение +/- 1 миллиона лет ( используя пролептический григорианский календарь ).
Все формулы и программное обеспечение находятся в свободном доступе.