Номер недели в месяц - PullRequest
       8

Номер недели в месяц

2 голосов
/ 09 августа 2011

Учитывая, что у меня есть номер недели определенного года, как я могу получить название месяца, в котором начинается неделя?(с использованием Obj-c)

например, неделя 2 2009 года должна быть конвертирована в январь 2009 года, а неделя 51 2004 года должна быть конвертирована в декабрь 2004 года

Ответы [ 2 ]

1 голос
/ 09 августа 2011

вы можете использовать библиотеку дат для этого, но если вы хотите рассчитать ее, вот объясненное решение

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

например:

январь 4 недели плюс 3 дня ... апрель 4 недели плюс 2 дня

хранить дополнительные дни для каждого месяца (может меняться только февраль, который может иметь 28 или 29 дней, в зависимости от того, високосный год или нет)

$extra_days = (january => 3, march => 3, april => 2, december => 3);

вычислите дополнительные дни февраля (0 или 1), вам нужно будет рассчитать, является ли это високосным годом ... вы можете сделать это с помощью такой операции, как ->

$your_year mod 4

что-то вроде:

if (($your_year - REFERENCE_LEAP_YEAR) mod 4 == 0) then "it's a leap year"

теперь у вас есть дополнительные дни для каждого месяца, который вы можете рассчитать. Каждый месяц имеет 4 недели, но вам нужен счетчик, чтобы узнать, отработает ли дополнительный день неделю. Например:

january = 3 extra days
-> weeks = 4 - extra_days = 3 febraury = 1 extra day
-> weeks = 8 - extra_days = 4 march = 3 extra days
-> weeks 12 - extra_days = 7
***now you have an extra week so..
-> weeks 13 - extra_days

...

0 голосов
/ 13 августа 2011

Найден ответ на вопрос: получите первый день данной недели

//convert week to month
    int weekNum = sdi.mWeek;
    const char *months[13]={"January","February","March","April","May","June","July","August","September","October","November","December","January"};
    struct tm curYear={0,0,0,1,0,sdi.mYear,0,0,0}; 
    time_t secsSinceEpoch=mktime(&curYear)+weekNum*86400*7;
    struct tm *candidateDate=gmtime(&secsSinceEpoch);    
    if (candidateDate->tm_wday!=1)
    {
        secsSinceEpoch+=(86400*(candidateDate->tm_wday-1)); 
        candidateDate=gmtime(&secsSinceEpoch);
    }    
    // [months[candidateDate->tm_mon]] returns month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...