powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Количество дней между двумя датами???
19 сообщений из 19, страница 1 из 1
Количество дней между двумя датами???
    #32359244
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста как подсчитать количество дней между двумя
датами...)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359282
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
static int MonthDayM0[ 12 ]={  0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 };
static int MonthDay4[ 12 ]={  31 , 29 , 31 , 30 ,  31 ,  30 ,  31 ,  31 ,  30 ,  31 ,  30 ,  31 };
static int MonthDayM4[ 12 ]={  0 , 31 , 60 , 91 , 121 , 152 , 182 , 213 , 244 , 274 , 305 , 335 };

static int MonthCDay0[ 13 ]={ 0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 , 365 };
static int MonthCDay4[ 13 ]={ 0 , 31 , 60 , 91 , 121 , 152 , 182 , 213 , 244 , 274 , 305 , 335 , 366 };

long year(char (*dt)[ 11 ]) {
	return atol(&((char*)dt)[ 6 ]);
}
long month(char (*dt)[ 11 ]) {
	return atol(&((char*)dt)[ 3 ]);
}
long day(char (*dt)[ 11 ]) {
	return atol((char*)dt);
}

long daycount(char (*dt)[ 11 ]) {

   short v= 0 ;
   if ( (year(dt)== 0 ) || (day(dt)== 0 ) || (month(dt)== 0 ) ) return  0 ;

   long  years=year(dt);

   long  v400=(years- 1 )/ 400 ;
   long  v4=(years- 1 )/ 100 ;

   long  vc=(years- 1 )/ 4 -(years- 1 )/ 100 +(years- 1 )/ 400 ; //  

   if ((years% 100 )== 0 ) {
      if ((years/ 100 )% 4 == 0 ) v= 1 ;
      else v= 0 ;
   } else {
      if ((years% 100 )% 4 == 0 ) v= 1 ;
      else v= 0 ;
   }

   if ( v )
      return (long) 
         (years- 1 )* 365 +vc+
         day(dt)+
         MonthDayM4[month(dt)- 1 ];
   else 
      return (long) 
         (years- 1 )* 365 +vc+
         day(dt)+
         MonthDayM0[month(dt)- 1 ];
}


...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359287
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как нибудь менее громоздко можно это сделать???
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359288
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char dt1[11]="01.01.2003";
char dt2[11]="31.12.2003";

long days=daycount(&dt1)-daycount(&dt2);
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359312
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо...))) щас попробую
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359544
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
#include <stdlib.h>
#include <stdio.h>

static int MonthDayM0[ 12 ]={  0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 };
static int MonthDay4[ 12 ]={  31 , 29 , 31 , 30 ,  31 ,  30 ,  31 ,  31 ,  30 ,  31 ,  30 ,  31 };
static int MonthDayM4[ 12 ]={  0 , 31 , 60 , 91 , 121 , 152 , 182 , 213 , 244 , 274 , 305 , 335 };

static int MonthCDay0[ 13 ]={ 0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 , 365 };
static int MonthCDay4[ 13 ]={ 0 , 31 , 60 , 91 , 121 , 152 , 182 , 213 , 244 , 274 , 305 , 335 , 366 };

long year(char (*dt)[ 11 ]) {
	return atol(&((char*)dt)[ 6 ]);
}
long month(char (*dt)[ 11 ]) {
	return atol(&((char*)dt)[ 3 ]);
}
long day(char (*dt)[ 11 ]) {
	return atol((char*)dt);
}

long daycount(char (*dt)[ 11 ]) {

   short v= 0 ;
   if ( (year(dt)== 0 ) || (day(dt)== 0 ) || (month(dt)== 0 ) ) return  0 ;

   long  years=year(dt);


   long  vc=(years- 1 )/ 4 -(years- 1 )/ 100 +(years- 1 )/ 400 ;

   if ((years% 100 )== 0 ) {
      if ((years/ 100 )% 4 == 0 ) v= 1 ;
      else v= 0 ;
   } else {
      if ((years% 100 )% 4 == 0 ) v= 1 ;
      else v= 0 ;
   }

   if ( v )
      return (long) 
         (years- 1 )* 365 +vc+
         day(dt)+
         MonthDayM4[month(dt)- 1 ];
   else 
      return (long) 
         (years- 1 )* 365 +vc+
         day(dt)+
         MonthDayM0[month(dt)- 1 ];
}


void setdate(char (*buf)[ 11 ],long cnt) {
   long C400= 0 ;
   long C100= 0 ;
   long C4= 0 ;
   long C1= 0 ;
   long y,d,m,i,v;

   if(cnt== 0 ){ y= 0 ;d= 0 ;m= 0 ; }
   else{
      C400=((cnt)/ 146097 );
      cnt=cnt% 146097 ;
      // 197 ; 241 ; 235 ; 232 ;  234 ; 238 ; 237 ; 229 ; 246 ;  400 - 227 ; 238 ;  227 ; 238 ; 228 ; 224 ; ( 226 ; 232 ; 241 ; 224 ; 234 ; 238 ; 241 ; 237 ; 251 ; 233 ;)
      if(cnt== 0 ){ y=C400* 400 ; m= 12 ; d= 31 ; cnt= 366 ; }
      else{
         C100=cnt/ 36524 ;
         cnt=cnt% 36524 ;
         // 197 ; 241 ; 235 ; 232 ;  234 ; 238 ; 237 ; 229 ; 246 ;  100 - 227 ; 238 ;  227 ; 238 ; 228 ; 224 ; ( 237 ; 229 ;  226 ; 232 ; 241 ; 224 ; 234 ; 238 ; 241 ; 237 ; 251 ; 233 ;)
         if(cnt== 0 ){
            y=C400* 400 +C100* 100 ;
            m= 12 ;
            if(y% 400 == 0 ) d= 30 ;
            else         d= 31 ;
            cnt= 365 ;
         }
         else{
            C4=cnt/ 1461 ;
            cnt=cnt% 1461 ;
            if(cnt== 0 ){ y=C400* 400 +C100* 100 +C4* 4 ; m= 12 ; d= 31 ; cnt= 366 ; }
            else{
               if(cnt<= 365 )        C1= 1 ;
               else if(cnt<= 2 * 365 ) C1= 2 ;
               else if(cnt<= 3 * 365 ) C1= 3 ;
               else                C1= 4 ;

               y=C400* 400 +C100* 100 +C4* 4 +C1;
               cnt=cnt- 365 *(C1- 1 );

               // 206 ; 239 ; 240 ; 229 ; 228 ; 229 ; 235 ; 255 ; 229 ; 236 ;  226 ; 232 ; 241 ; 224 ; 234 ; 238 ; 241 ; 237 ; 238 ; 241 ; 242 ; 252 ;
               v= 0 ;
               if ((y% 100 )== 0 ) {
                  if ((y/ 100 )% 4 == 0 ) v= 1 ;
                  else v= 0 ;
               } else {
                  if ((y% 100 )% 4 == 0 ) v= 1 ;
                  else v= 0 ;
               }
               // 206 ; 239 ; 240 ; 229 ; 228 ; 229 ; 235 ; 255 ; 229 ; 236 ;  236 ; 229 ; 241 ; 255 ; 246 ;  232 ;  228 ; 229 ; 237 ; 252 ;
               if(v== 0 ) { 
                  for(i= 1 ;i< 13 ;i++){
                     if(MonthCDay0[i]>=cnt) {
                        m=i;
                        break;
                     }
                  }
                  d=cnt-MonthCDay0[i- 1 ];
               } else {
                  for(i= 1 ;i< 13 ;i++){
                     if(MonthCDay4[i]>=cnt) {
                        m=i;
                        break;
                     }
                  }
                  d=cnt-MonthCDay4[i- 1 ];
               }
            }
         }
      }
   }
   sprintf((char*)buf, "%02d.%02d.%04d" ,d,m,y);
}

void main() {
   char dt1[ 11 ]= "01 . 01 . 2003 ";
   char dt2[ 11 ]= "31 . 12 . 2003 ";

   printf( "%s - %s = %d\n" ,dt2,dt1,daycount(&dt2)-daycount(&dt1));

   setdate(&dt1,daycount(&dt1));
   setdate(&dt2,daycount(&dt2));

   printf( "%s - %s = %d\n" ,dt2,dt1,daycount(&dt2)-daycount(&dt1));

}

...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359639
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman:
а что если у меня дата хранятся в запросе...)
Я пишу так:
char dt1[11] = "01.01.2003";
char* dt2[11];
dt2[11] = (Query3->FieldByName("Дата")->AsString).c_str();
long days1 = daycount(&dt2) - daycount(&dt1);
он у меня ругается на &dt2...)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359665
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда и в запресе юзай

DATEDIFF(d,bdate,edate)
____
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359671
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JibSkeart
Этим он выдасть количество дней...???
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359674
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
____
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359933
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
те функции, которые я тут привел счетают количество дней от Рождества Христова. А то что касается DATEDIFF - такое дерьмо....(((
И вообще никто не работает с датами хуже чем MS SQL и Sybase
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32359944
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman:
На самом деле я написал вот таким образом:
TDateTime dt1, dt2;
int days1;
TDateTime date1;
dt1 = Query3->FieldByName("Дата1")->AsString;
dt2 = Query3->FieldByName("Дата1")->AsString;
date1 = dt2-dt1; days1 = StrToInt(date1.FormatString("dd"));
Очень даже хорошо работает....)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32360035
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найди разницу между 01.01.1615 и 01.01.2012 ?
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32360107
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman
Ладно уговорил...будут погрешности...У меня просто разница максимум в год...)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32360113
'FaTsO'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой ошибся...
Мне не нужно считать сколько лет...мне именно скока дней...)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32361703
OK_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я код реализовал на VC ++ 6.0 , ВСЕ ФУНКЦИ сделал
глобальными, основной код main {} прикрепил к командной кнопке
при значениях
char dt1[11]="01.01.2003";
char dt2[11]="31/12.2003"

определено

31.12.2003 - 01.01.2003 = 364 days

что правильно.
Глубоко, детально некогда анализировать
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32361743
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 gardenman

я не первый день пользуюсь всем этим и проблем не возникает ,
зачем изобретать велосипед ?

так что насчет дерьмо вы ошибаетесь .

____
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32361911
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу того, как MS и Sybase реализовали работу с датами в своих продуктах.
1) Диапазон дат, который подразумевает тип DATETIME - очень узок...
Есть например, люди, у которых трудовой стаж начался 1935 году например,
есть люди, вообще у которых дата рождения - позапрошлый век.
И меня, мягко говоря, предоставленный MS и Sybase диапазон допустимых значений дат не устраивает.
2) поскольку я работал в банке, и мне приходилось начислять процетны на остатки, (по нескольку десятков тысяч транзакций в день) - очень желательно чтобы разница между двумя датами - вычислялась максимально быстно, и лучше - на сервере) и лучше в сохраненной процедуре...)
Для этого я и реализовал все это...))в предверии 2000 года...))ну вы помните)))
...
Рейтинг: 0 / 0
Количество дней между двумя датами???
    #32361959
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этого и надобыло начинать .

____
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Количество дней между двумя датами???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]