Как мне работать со значениями дня с начала эпохи до утверждения C ++ 20?

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

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

1

Решение

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

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

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

4

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

Я одобрил ответ 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)

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector