2016-03-10 8 views
0
года

Допустит, у меня есть: недели = 13 года = 2016месяц от номера недели и

Есть ли что-нибудь в наддуве или стандартной библиотеке, чтобы получить номер месяца (или имя) из этих двух входов.

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

Спасибо!

+0

Возможно, я мог бы получить последний день недели, а затем получить месяц, используя день, неделю и год? – user2930006

+0

Я понимаю, что простой способ - просто спросить. Но вы действительно должны просто прочитать документацию: http://www.boost.org/doc/libs/1_60_0/doc/html/date_time.html, найдите несколько примеров. (Кстати, в случае, если я был слишком тонким: это был мой способ сказать вам ** rtfm **) – bolov

+0

@bolov Спасибо. Я упомянул boost :: date_time, но до сих пор не смог найти способ. Я не могу создать boost :: gregorian :: date объект со входами, которые у меня есть. Проверял другие функции и алгоритмы, но ничего не кажется подходящим. Если бы вы могли дать какой-либо намек, я буду этому благодарен. – user2930006

ответ

2

Если вы готовы использовать бесплатный, с открытым исходным кодом библиотеки, которая не повысить и с помощью 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)

1
#include <boost/date_time/gregorian/gregorian.hpp> 

using namespace boost::gregorian; 

// Initialize variables with some values 
int week_nmb = 13, year = 2017; 

date d = date(year, Jan, 1) + weeks(week_nmb); 

int month = d.month(); 
Смежные вопросы