Я проголосовал за собственный ответ user1095108, так как он получает правильный ответ.Но я хотел добавить больше информации, которая не вписывалась бы в комментарий.
«Начало недели» не всегда согласовано.Некоторые страны переносят понедельник как начало недели, как и стандарт ISO.А другие страны отмечают воскресенье как начало недели.Эта библиотека старается сохранять нейтралитет в этом вопросе.
Даже если вы определите, какой день недели вы нацеливаете, вам также нужно определить, где на планете вы хотите принять во внимание при поиске второй.неделя начинается.
Судя по вашему коду, я предполагаю:
- Неделя начинается в воскресенье.
- Мы хотим найти началонеделю в соответствии с UTC.
Для следующего кода предположим:
using namespace date;
using namespace std::chrono;
только для того, чтобы не допустить чрезмерного многословия вещей.
Первое, что ябыло бы преобразовать входные данные в time_point
с точностью до секунд:
auto tp = floor<seconds>(system_clock::now());
Затем, чтобы выполнить вычисления дня недели, такие как нахождение дня недели ввода tp
, каждый собираетсянужно еще time_point
с точностью до дней:
auto dp = floor<days>(tp);
Вы можете построить weekday
прямо из точности дня time_point
(dp
), вместо того, чтобы проходить через более дорогиевычисление формирования year_month_weekday
:
weekday{dp}
затем (как вы показываете) вычтите количество дней с начала недели:
dp -= weekday{dp} - Sunday;
Теперь у вас есть два time_point
s: ваш ввод и начало недели.Вы можете просто вычесть их, чтобы получить количество секунд в неделю:
std::cout << tp - dp << '\n';
Теперь причина, по которой floor<weeks>(tp)
не дает желаемого результата, состоит в том, что system_clock
равно Unix Time.Эта мера отсчитывает время с 1970-01-01 00:00:00 UTC (без учета високосных секунд).И 1970-01-01 был четверг.Таким образом, усечение system_clock::time_point
с точностью до weeks
определяет «начало недели» как четверг.
Для еще большего удовольствия вычислите количество секунд с начала недели по местному времени., что может включать корректировки летнего времени.В этом случае вычисление дает более одного правильного ответа: считаете ли вы физические секунды, из-за которых у некоторых недель не получается ровно 604800 секунд, или вы считаете «календарными секундами»?Например, ноябрь / 4/2018 1:00 EST (Америка / New_York) 1 или 2 часа в неделю?Как только вы решите, какой ответ правильный, эта библиотека сможет его вычислить.