Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с датой, Подскажите, как определять числа? 
V
    Опции темы
kulikoff
Дата 12.5.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



Есть такая ситуация, мне надо, чтоб прога делала из БД выборку записей в пределах текущего месяца. Номер месяца я определяю из функции DecodeDate, а как мне написать, чтоб прога знала, что в мае 31 день, а в июне - 30? Ну и чтоб отслеживала высокосный и нет года?
Совсем что-то понять не могу... 
PM MAIL WWW ICQ Skype   Вверх
comtat
Дата 12.5.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 3
Всего: 71



написано на C++

но конверитация займет минут 5

Код

// функция определения високосного года 
inline 
bool is_leap_year(const int year) 

   return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); 


// сделано на основе MATLAB: datenummx.c 
double DateToNum(int year, int month, int day, int hour, int minute, int second) 

   // count day in month 
   static cdm[] = {0,31,59,90,120,151,181,212,243,273,304,334}; 

    if (month < 1) 
        month = 1; 
   else if (month > 12) 
   { 
        year += (month-1)/12; 
        month = ((month-1) % 12) + 1; 
    } 

   // convert [y, mo, d] -> num 
   const double d_year = year; 
   double num = 365 * year + ceil(d_year / 4) - ceil(d_year / 100) + 
               ceil(d_year / 400) + cdm[month - 1] + day; 

   if (month > 2 && is_leap_year(year)) 
      ++num; 

   // add to num: [h, mi, s] -> num 
   num += double(hour * 3600 + minute * 60 + second) / 86400; 

   return num; 


// сделано на основе datevecmx.c 
void NumToDate(double num, // in 
          int& year, int& month, int& day, int& hour, int& minute, int& second) // out 

   // дни по месяцам: 
   // для не високосного года 
   static const int cdm0[] = {0,31,59,90,120,151,181,212,243,273,304,334,365}; 
   // для високосного года 
   static const int cdm1[] = {0,31,60,91,121,152,182,213,244,274,305,335,366}; 

   // break apart: [year, month, day] and [hour, minute, second] 
   const double p1 = floor(num); 
   const double p2 = num - p1; 

   // take first part 
   num = p1; 

   year = floor(num / 365.2425); 

   double ts = num - (year * 365 + ceil(year * 0.25) - ceil(year * 0.01) + ceil(year * 0.0025)); 
   if (!(ts > 0)) // ts <= 0 
   { 
      --year; 
      num -= (year * 365 + ceil(year * 0.25) - ceil(year * 0.01) + ceil(year * 0.0025)); 
   } 
   else 
      num = ts; 

   const int* cdm = is_leap_year(year)? cdm1: cdm0; 

   month = (int)num / 29 - 1; 

   if (num > cdm[month + 1]) 
      ++month; 

   num -= cdm[month]; 
   ++month; 

   day = floor(num); 

   // take second part 
   num = CDouble::Round(p2 * 86400); // translate to seconds 

   ts = num; 
   num = floor(num / 60.0); 
   second = ts - num * 60.0; // seconds 

   ts = num; 
   num = floor(num / 60); 
   minute = ts - num * 60; // minutes 

   ts = num; 
   num = floor(num / 24); 
   hour = ts - num * 24; // hours 
}
 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Snowy
Дата 12.5.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



В DateUtils полно функций по работе с датами.
Тебе нужны:
DaysInAMonth - дней в месяце (на входе месяц и год)
DaysInYear - дней в году (на входе год)
IsLeapYear - говорит високосный год или нет (на входе год)
DayOfTheMonth - возвращает день из TDateTime
и т.д.
 
PM MAIL   Вверх
Демо
Дата 12.5.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



kulikoff

Простейший метод - использовать DaysInAMonth, либо см. реализацию этих функций в модуле DateUtils.pas 


--------------------
    
PM MAIL ICQ Skype   Вверх
kulikoff
Дата 12.5.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



спасибо, всё сделал 
PM MAIL WWW ICQ Skype   Вверх
Dynamic
Дата 12.5.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



Цитата(kulikoff @  12.5.2006,  09:16 Найти цитируемый пост)
мне надо, чтоб прога делала из БД выборку записей в пределах текущего месяца

а что за БД? может запросом?
 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1125 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.