Определение кол-ва дней в месяце... Как?
От: N_i_t_r_o  
Дата: 12.07.07 09:08
Оценка: :)
Всем привет!
Люди, можете подсказать? Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце? Я чё-то никак не соображу как это сделать. И вообще это возможно? И если не возможно, то хотябы как определить количество дней в текущем месяце? Набор функций в time.h прямо скажем не богатый, сижу мучаюсь, ничего придумать не могу.
Спасибо.
Re: Определение кол-ва дней в месяце... Как?
От: Socrat Россия  
Дата: 12.07.07 09:12
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Всем привет!

N__>Люди, можете подсказать? Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце? Я чё-то никак не соображу как это сделать. И вообще это возможно? И если не возможно, то хотябы как определить количество дней в текущем месяце? Набор функций в time.h прямо скажем не богатый, сижу мучаюсь, ничего придумать не могу.
N__>Спасибо.

Ну, например, вычесть из первого числа следующего месяца первое число этого. Или хранить в массиве. Или посмотреть в календаре. Или по косточкам пальцев. Вариантов много.
Re: Определение кол-ва дней в месяце... Как?
От: serge_levin Россия  
Дата: 12.07.07 09:18
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце?


Примерно так
int getDays( int month, int year ) // months - 0 for january, ..., 11 for december
{
  static const days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  int result = -1;

  if( month < 0 || month > 11 )
    return result;

  result = days[ month ];
  if( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ))
    ++result;

  return result;
}
Re: Определение кол-ва дней в месяце... Как?
От: Аноним  
Дата: 12.07.07 09:21
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Всем привет!

N__>Люди, можете подсказать? Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце? Я чё-то никак не соображу как это сделать. И вообще это возможно? И если не возможно, то хотябы как определить количество дней в текущем месяце? Набор функций в time.h прямо скажем не богатый, сижу мучаюсь, ничего придумать не могу.
N__>Спасибо.

Буду краток. Гугль. daysofmonth.
Re: Определение кол-ва дней в месяце... Как?
От: valker  
Дата: 12.07.07 09:25
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Всем привет!

N__>Люди, можете подсказать? Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце? Я чё-то никак не соображу как это сделать. И вообще это возможно? И если не возможно, то хотябы как определить количество дней в текущем месяце? Набор функций в time.h прямо скажем не богатый, сижу мучаюсь, ничего придумать не могу.
N__>Спасибо.

http://ru.wikipedia.org/wiki/Григорианский_календарь
Re[2]: Определение кол-ва дней в месяце... Как?
От: serge_levin Россия  
Дата: 12.07.07 09:26
Оценка: +1
Здравствуйте, Socrat, Вы писали:

S>Здравствуйте, N_i_t_r_o, Вы писали:


S>Ну, например, вычесть из первого числа следующего месяца первое число этого. Или хранить в массиве. Или посмотреть в календаре. Или по косточкам пальцев. Вариантов много.


Кстати, хороший способ

int getDays( int year, int month )
{
  struct tm now  = { 0, 0, 0, 1, month, year - 1900, 0, 0, 0 };
  struct tm next = { 0, 0, 0, 1, ( month + 1 ) % 12, year + ( month + 1 ) / 12 - 1900, 0, 0, 0 };

  return ( mktime( &next ) - mktime( &now ) ) / ( 24*60*60 );
}
Re: Определение кол-ва дней в месяце... Как?
От: wils0n www.atzone.org
Дата: 12.07.07 09:32
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Всем привет!

N__>Люди, можете подсказать? Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце? Я чё-то никак не соображу как это сделать. И вообще это возможно? И если не возможно, то хотябы как определить количество дней в текущем месяце? Набор функций в time.h прямо скажем не богатый, сижу мучаюсь, ничего придумать не могу.
N__>Спасибо.


  3 int days_in_month(int month, int year)
  4 {
  5     if (year < 0) return -1;
  6     switch (month) {
  7         case 1:case 3:case 5:case 7:case 8:case 10:case 12:
  8                 return 31;
  9         case 4:case 6:case 9:case 11:
 10                 return 30;
 11         case 2:
 12                 return 28 + int(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
 13         default:
 14                 return -1;
 15     }
 16 }
gcc 4.2
Re[3]: Определение кол-ва дней в месяце... Как?
От: Socrat Россия  
Дата: 12.07.07 09:34
Оценка: 22 (7)
Здравствуйте, serge_levin, Вы писали:

S>>Ну, например, вычесть из первого числа следующего месяца первое число этого. Или хранить в массиве. Или посмотреть в календаре. Или по косточкам пальцев. Вариантов много.


_>Кстати, хороший способ


_>
_>int getDays( int year, int month )
_>{
_>  struct tm now  = { 0, 0, 0, 1, month, year - 1900, 0, 0, 0 };
_>  struct tm next = { 0, 0, 0, 1, ( month + 1 ) % 12, year + ( month + 1 ) / 12 - 1900, 0, 0, 0 };

_>  return ( mktime( &next ) - mktime( &now ) ) / ( 24*60*60 );
_>}
_>



А так?

int days = 31 - (month%7)%2;
if (month==1)
{
    // Февраль, понимаешь ли...
}
Re: Определение кол-ва дней в месяце... Как?
От: N_i_t_r_o  
Дата: 12.07.07 09:38
Оценка:
Прошу прощения, сам допер.
    time_t sys_time = 0;
    struct tm *timeinfo1;
    struct tm timeinfo2;

    time(&sys_time);
    timeinfo1 = localtime(&sys_time);

    //timeinfo1->tm_year++;
    timeinfo1->tm_mon = month;
    timeinfo1->tm_mday = 1;
    
    timeinfo2.tm_hour = timeinfo1->tm_hour;
    timeinfo2.tm_isdst = timeinfo1->tm_isdst;
    timeinfo2.tm_mday = timeinfo1->tm_mday;
    timeinfo2.tm_min = timeinfo1->tm_min;
    timeinfo2.tm_mon = timeinfo1->tm_mon + 1;
    timeinfo2.tm_sec = timeinfo1->tm_sec;
    timeinfo2.tm_wday = timeinfo1->tm_wday;
    timeinfo2.tm_yday = timeinfo1->tm_yday;
    timeinfo2.tm_year = timeinfo1->tm_year;

    double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;


Надо на обед идти, а то голова не соображает уже
Re[4]: Определение кол-ва дней в месяце... Как?
От: wils0n www.atzone.org
Дата: 12.07.07 09:43
Оценка:
Здравствуйте, Socrat, Вы писали:

S>А так?


S>
S>int days = 31 - (month%7)%2;
S>if (month==1)
S>{
S>    // Февраль, понимаешь ли...
S>}
S>

классно
gcc 4.2
Re[5]: Определение кол-ва дней в месяце... Как?
От: Socrat Россия  
Дата: 12.07.07 09:44
Оценка:
Здравствуйте, wils0n, Вы писали:

W>Здравствуйте, Socrat, Вы писали:


S>>А так?


S>>
S>>int days = 31 - (month%7)%2;
S>>if (month==1)
S>>{
S>>    // Февраль, понимаешь ли...
S>>}
S>>

W>классно

Отгадай, какому методу из перечисленных мной он соответствует?
Re[2]: Определение кол-ва дней в месяце... Как?
От: serge_levin Россия  
Дата: 12.07.07 09:47
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Прошу прощения, сам допер.

N__>

N__>    double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;
N__>


N__>Надо на обед идти, а то голова не соображает уже


Точно надо. Забыл на 24 еще поделить, а то получишь ответ в часах, а не в днях.
Re[3]: Определение кол-ва дней в месяце... Как?
От: N_i_t_r_o  
Дата: 12.07.07 09:49
Оценка:
_>Точно надо. Забыл на 24 еще поделить, а то получишь ответ в часах, а не в днях.

Да да.

Всем спасибо за ответы
Re[6]: Определение кол-ва дней в месяце... Как?
От: wils0n www.atzone.org
Дата: 12.07.07 15:36
Оценка: 3 (1)
Здравствуйте, Socrat, Вы писали:

S>Здравствуйте, wils0n, Вы писали:


W>>Здравствуйте, Socrat, Вы писали:


S>>>А так?


S>>>
S>>>int days = 31 - (month%7)%2;
S>>>if (month==1)
S>>>{
S>>>    // Февраль, понимаешь ли...
S>>>}
S>>>

W>>классно

S>Отгадай, какому методу из перечисленных мной он соответствует?

По косточкам пальцев, конечно!
gcc 4.2
Re[2]: Определение кол-ва дней в месяце... Как?
От: green.nsk  
Дата: 13.07.07 06:39
Оценка:
Здравствуйте, serge_levin, Вы писали:
_>
_>  result = days[ month ];
_>  if( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ))
_>    ++result;
_>

у вас в високосном году все месяцы на день длиннее?
Re[3]: Определение кол-ва дней в месяце... Как?
От: Socrat Россия  
Дата: 08.07.08 06:34
Оценка:
Здравствуйте, serge_levin, Вы писали:

S>>Ну, например, вычесть из первого числа следующего месяца первое число этого. Или хранить в массиве. Или посмотреть в календаре. Или по косточкам пальцев. Вариантов много.


_>Кстати, хороший способ


_>
_>int getDays( int year, int month )
_>{
_>  struct tm now  = { 0, 0, 0, 1, month, year - 1900, 0, 0, 0 };
_>  struct tm next = { 0, 0, 0, 1, ( month + 1 ) % 12, year + ( month + 1 ) / 12 - 1900, 0, 0, 0 };

_>  return ( mktime( &next ) - mktime( &now ) ) / ( 24*60*60 );
_>}
_>


Да, я тут вспомнил про эту ветку и решил добавить еще метод: к первому числу искомого месяца добавляем 31 день и полученную дату (это будет уже следующий месяц) вычитаем из 32.
Re[2]: Определение кол-ва дней в месяце... Как?
От: GGoga  
Дата: 08.07.08 08:53
Оценка:
Здравствуйте, N_i_t_r_o, Вы писали:

N__>Прошу прощения, сам допер.

N__>
N__>    time_t sys_time = 0;
N__>    struct tm *timeinfo1;
N__>    struct tm timeinfo2;

N__>    time(&sys_time);
N__>    timeinfo1 = localtime(&sys_time);

N__>    //timeinfo1->tm_year++;
N__>    timeinfo1->tm_mon = month;
N__>    timeinfo1->tm_mday = 1;
    
N__>    timeinfo2.tm_hour = timeinfo1->tm_hour;
N__>    timeinfo2.tm_isdst = timeinfo1->tm_isdst;
N__>    timeinfo2.tm_mday = timeinfo1->tm_mday;
N__>    timeinfo2.tm_min = timeinfo1->tm_min;
N__>    timeinfo2.tm_mon = timeinfo1->tm_mon + 1;
N__>    timeinfo2.tm_sec = timeinfo1->tm_sec;
N__>    timeinfo2.tm_wday = timeinfo1->tm_wday;
N__>    timeinfo2.tm_yday = timeinfo1->tm_yday;
N__>    timeinfo2.tm_year = timeinfo1->tm_year;

N__>    double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;
N__>


Лаконичный код, ничего не скажешь
Re[2]: Определение кол-ва дней в месяце... Как?
От: demi США  
Дата: 09.07.08 16:57
Оценка:
Здравствуйте, serge_levin, Вы писали:

_>Здравствуйте, N_i_t_r_o, Вы писали:


N__>>Как используя C-шные функции (пошу на C) можно код написать, который по указанному году и месяцу определял бы количество дней в этом месяце?


_>Примерно так

_>
_>int getDays( int month, int year ) // months - 0 for january, ..., 11 for december
_>{
_>  static const days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
_>  int result = -1;

_>  if( month < 0 || month > 11 )
_>    return result;

_>  result = days[ month ];
_>  if( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ))
_>    ++result;

_>  return result;
_>}
_>


Ну так код с ошибкой! Если год високосный получается что и в августе 32 дня! if (month == 1) забыл...
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Re[3]: Определение кол-ва дней в месяце... Как?
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 10.07.08 10:53
Оценка:
Здравствуйте, GGoga, Вы писали:

GG>Здравствуйте, N_i_t_r_o, Вы писали:


N__>>Прошу прощения, сам допер.

N__>>
N__>>    time_t sys_time = 0;
N__>>    struct tm *timeinfo1;
N__>>    struct tm timeinfo2;

N__>>    time(&sys_time);
N__>>    timeinfo1 = localtime(&sys_time);

N__>>    //timeinfo1->tm_year++;
N__>>    timeinfo1->tm_mon = month;
N__>>    timeinfo1->tm_mday = 1;
    
N__>>    timeinfo2.tm_hour = timeinfo1->tm_hour;
N__>>    timeinfo2.tm_isdst = timeinfo1->tm_isdst;
N__>>    timeinfo2.tm_mday = timeinfo1->tm_mday;
N__>>    timeinfo2.tm_min = timeinfo1->tm_min;
N__>>    timeinfo2.tm_mon = timeinfo1->tm_mon + 1;
N__>>    timeinfo2.tm_sec = timeinfo1->tm_sec;
N__>>    timeinfo2.tm_wday = timeinfo1->tm_wday;
N__>>    timeinfo2.tm_yday = timeinfo1->tm_yday;
N__>>    timeinfo2.tm_year = timeinfo1->tm_year;

N__>>    double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;
N__>>


GG>Лаконичный код, ничего не скажешь


Так можно же и подсократить Например:

time_t sys_time = 0;
struct tm *timeinfo1;
struct tm timeinfo2;

time(&sys_time);

timeinfo1 = localtime(&sys_time);
timeinfo1->tm_mon = month;
timeinfo1->tm_mday = 1;

timeinfo2 = timeinfo1; // инициализируем timeinfo2 всеми значениями timeinfo1
timeinfo2.tm_mon++;    // изменяем необходимые поля

double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;
Re[4]: Определение кол-ва дней в месяце... Как?
От: GGoga  
Дата: 10.07.08 11:51
Оценка:
Здравствуйте, php-coder, Вы писали:

PC>Так можно же и подсократить Например:


PC>
PC>time_t sys_time = 0;
PC>struct tm *timeinfo1;
PC>struct tm timeinfo2;

PC>time(&sys_time);

PC>timeinfo1 = localtime(&sys_time);
PC>timeinfo1->tm_mon = month;
PC>timeinfo1->tm_mday = 1;

PC>timeinfo2 = timeinfo1; // инициализируем timeinfo2 всеми значениями timeinfo1
PC>timeinfo2.tm_mon++;    // изменяем необходимые поля

PC>double i = difftime(mktime(&timeinfo2), mktime(timeinfo1))/3600;
PC>


Да, это конечно по меньше будет, но согласитесь, что вариант, предложенный Socrat-ом, был намного "лаконичнее" И, лично мое мнение, красивее, а главное — работал бы немного быстрее (хотя в данном случае затраты по времени не столь и велики)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.