Как мне работать со значениями дня с начала эпохи до утверждения C ++ 20? - PullRequest
0 голосов
/ 03 июня 2018

Я пишу некоторый код, который использует дни, начиная с какой-то эпохи и год-месяц-день, независимо друг от друга. edit: Я должен также упомянуть, что теоретически годы могут быть отрицательными, и год 0 может существовать или не существовать .

Теперь C ++ 20 представитstd::year_month_day класс , что должно быть весьма полезно, как само по себе, так и во взаимодействии с моими классами.На данный момент, однако, должен ли я вообще использовать std::chrono для своих дат вообще, или это слишком бесполезно, если я только когда-нибудь сложу и вычту даты разрешения дня?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

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

Предложение C ++ 20 настроено на взаимодействие с несколькими пользовательскими календарями.Действительно, рабочая реализация , на которую ссылается JVApen, фактически реализует несколько примеров пользовательских календарей.Ключом к тому, чтобы ваш пользовательский класс календаря взаимодействовал с системой std::chrono, было бы сделать только одну вещь:

  1. Неявное преобразование в 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)

0 голосов
/ 03 июня 2018

Расширения до <chrono> полностью приняты.Мне кажется, что если вы заполучите библиотеку, содержащую их, она не сломается при обновлении до C ++ 20.

Тем не менее, предложение относится к * 1006.* рабочая реализация автором этого предложения.Если это действительно то, что вы хотите, я предлагаю вам использовать это как внешнюю библиотеку.

Важно отметить, что библиотека должна быть в состоянии обрабатывать все особые случаи, которые вы можете себе представить, связанные со временем.Часовые пояса, 29 февраля ... Просто чтобы вам не приходилось их учитывать, я бы рекомендовал использовать этот класс вместо собственной реализации.

...