Как рассчитать номер недели с учетом даты? - PullRequest
25 голосов
/ 08 ноября 2008

Если у меня есть дата, как рассчитать номер недели для этой даты в этом году?

Например, в 2008 году с 1 января по 6 января на неделе 1, а с 7 по 13 января на неделе 2, поэтому, если бы моя дата была 10 января 2008 года, мой номер недели был бы 2.

Алгоритм был бы хорош для начала, и пример кода также помог бы - я занимаюсь разработкой на C ++ для Windows.

Связанный:

Получение номера недели от даты в MS SQL Server 2005?

Ответы [ 15 ]

0 голосов
/ 23 июля 2014
time_t t = time(NULL);
tm* timePtr = localtime(&t);
double day_of_year=timePtr->tm_yday +1 ; // 1-365
int week_of_year =(int) ceill(day_of_year/7.0);
0 голосов
/ 14 мая 2013
public int GetWeekOfYear(DateTime todayDate)
{
    int days = todayDate.DayOfYear;
    float result = days / 7;
    result=result+1;
    Response.Write(result.ToString());
    return Convert.ToInt32(result);
}

Просто передайте текущую дату в качестве параметра этой функции. Тогда вы получите номер текущей недели. Надеюсь, это решит вашу проблему. Любые предложения приветствуются.

0 голосов
/ 26 сентября 2012

Я предполагал, что первая неделя в году может содержать до 7 дней, как показано в ответе Оли. Кодекс не относится к культурам, где неделя начинается не в воскресенье, а во многих других частях света.

tm t = ... //the date on which to find week of year

int wy = -1;

struct tm t1;
t1.tm_year = t.tm_year;
t1.tm_mday = t1.tm_mon = 1; //set to 1st of January
time_t tt = mktime(&t1); //compute tm

//remove days for 1st week
int yd = t.tm_yday - (7 - t1.tm_wday);
if(yd <= 0 ) //first week is now negative
  wy = 0;
else
  wy = (int)std::ceil( (double) ( yd/7) ); //second week will be 1 
0 голосов
/ 19 февраля 2009

Boost предоставляет григорианский :: date :: week_number () см http://www.boost.org/doc/libs/1_38_0/doc/html/boost/gregorian/date.html и http://www.boost.org/doc/libs/1_38_0/boost/date_time/gregorian/greg_date.hpp.

Однако я не могу найти способ получить номер года, который соответствует номеру недели (который может отличаться от календарного года для этой даты).

0 голосов
/ 08 ноября 2008

Используйте gmtime или местное время для вычисления дней с воскресенья (то есть дня недели) и дней с 1 января (обратите внимание, что 1 января - "0" в последнем).

Произвольный бит определяет, с какого дня года начинается неделя 1: обычно это зависит только от того, какой день недели был 1 января, который, конечно, вы можете рассчитать на основе двух фрагментов информации из gmtime. Затем используйте поиск по таблице для 7 возможностей, это, вероятно, проще, чем кодирование правил.

Например, я думаю, что Outlook использует стандарт, согласно которому Неделя 1 - это первая неделя, содержащая четверг. Таким образом, если 1 января - воскресенье, то первый день недели 1 - 1 января или день 0. Остальные возможности: понедельник, -1; Вторник -2; Среда -3; Четверг -4; Пятница, 2; Суббота, 1.

Обратите внимание на отрицательные числа: «Воскресенье недели 1» на самом деле не существует в 4 из 7 случаев, но если мы представим, что это был день назад в предыдущем году, мы получим правильный ответ.

Получив это, количество дней между ним и вашей датой говорит вам номер недели: разделите на 7 и добавьте 1.

Тем не менее, я думаю, что где-то есть Windows API, который даст вам тот же номер недели, что и Outlook. Я просто не знаю, что это такое, и, конечно, если ваши правила недели 1 отличаются от правил Outlook, то, вероятно, они не очень полезны.

непроверенный код:

int firstdays[7] = { 0, -1, -2, -3, -4, 2, 1 }; // or some other Week 1 rule
struct tm breakdown;
time_t target = time_you_care_about();
_gmtime_s(&breakdown,&target);
int dayofweek = breakdown.tm_wday;
int dayofyear = breakdown.tm_yday;

int jan1wday = (dayofweek - dayofyear) % 7;
if (jan1wday < 0) jan1wday += 7;

int week1first = firstdays[jan1wday];
if (dayofyear < week1first) return 0;
return ((dayofyear - week1first)/7) + 1;

Нечто подобное, во всяком случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...