Я одобрил ответ JVApen и призываю вас принять это как лучший ответ.Однако я хотел добавить немного больше информации, которая может быть вам полезна.
Предложение C ++ 20 настроено на взаимодействие с несколькими пользовательскими календарями.Действительно, рабочая реализация , на которую ссылается JVApen, фактически реализует несколько примеров пользовательских календарей.Ключом к тому, чтобы ваш пользовательский класс календаря взаимодействовал с системой std::chrono
, было бы сделать только одну вещь:
- Неявное преобразование в
std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<int, std::ratio<86400>>>
.
Вышеупомянутый ужасно выглядящий тип имеет более удобное имя в C ++ 20, которое просто typedef
по сравнению с вышеуказанным типом: sys_days
.Это просто time_point
с использованием system_clock
с точностью до days
.Под капотом этот тип не содержит ничего, кроме количества дней, прошедших с (или до) 1970-01-01.
Если ваш календарный тип может преобразовываться в этот тип std::chrono
(который существует в C и обратно)++ 11/14/17 за исключением typedef
), тогда вы можете использовать std::chrono
, чтобы очень эффективно выполнять дневную арифметику, поскольку она будет буквально просто прибавлять / вычитать int
под капотом.
И если у вас есть эта точность дня time_point
, chrono
очень легко добавляет к ней «время суток», просто добавляя часы, минуты, секунды, миллисекунды, что угодно, например:
system_clock::time_point tp = sys_days{2018y/June/3} + 14h + 15min + 36s + 123ms;
(подпрограмма в вашей календарной системе для 2018y/June/3
)