Если вы готовы использовать бесплатный, с открытым исходным кодом библиотеки, которая не повысить и с помощью C++ 11 или более поздней версии, проверьте:
https://github.com/HowardHinnant/date
Пример кода:
#include "date.h"
#include "iso_week.h"
#include <iostream>
int
main()
{
using namespace iso_week::literals;
auto ymd = date::year_month_day{2016_y/13_w/mon};
std::cout << ymd << '\n';
}
В этом выходы:
2016-03-28
Есть year()
, month()
и day()
геттеры на объекте ymd
.
Существует полная документация по вышеуказанной ссылке. «date.h» и «iso_week.h» являются только заголовками, поэтому нет необходимости ссылаться на какой-либо другой источник.
Эти расчеты строго следуют правилам, установленным для основанного на ИОИ года here. Первая неделя года начинается в понедельник после последнего четверга декабря предыдущего года. Это означает, что иногда ISO-год для даты отличается от григорианского года. Например, 2016_y/jan/1 == 2015_y/53_w/fri
, и в этом псевдокоде 2016_y
и 2015_y
имеют разные типы (date::year
и iso_week::year
), поэтому их нельзя случайно спутать. Система типа C++ обнаруживает случайные неоднозначности во время компиляции.
Это так же просто пойти в другом направлении:
#include "date.h"
#include "iso_week.h"
#include <iostream>
int
main()
{
using namespace date::literals;
auto iso = iso_week::year_weeknum_weekday{2016_y/mar/28};
std::cout << iso << '\n';
}
, который выводит:
2016-W13-Mon
В C++ 14, если ваши входы константы времени компиляции, то результат может быть constexpr
(вычисление времени компиляции). (требуется больше constexpr
мышц, чем поддерживается VS-2015)
Возможно, я мог бы получить последний день недели, а затем получить месяц, используя день, неделю и год? – user2930006
Я понимаю, что простой способ - просто спросить. Но вы действительно должны просто прочитать документацию: http://www.boost.org/doc/libs/1_60_0/doc/html/date_time.html, найдите несколько примеров. (Кстати, в случае, если я был слишком тонким: это был мой способ сказать вам ** rtfm **) – bolov
@bolov Спасибо. Я упомянул boost :: date_time, но до сих пор не смог найти способ. Я не могу создать boost :: gregorian :: date объект со входами, которые у меня есть. Проверял другие функции и алгоритмы, но ничего не кажется подходящим. Если бы вы могли дать какой-либо намек, я буду этому благодарен. – user2930006