Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Количество дней между двумя датами??? / 19 сообщений из 19, страница 1 из 1
22.12.2003, 09:05
    #32359244
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
Подскажите пожалуйста как подсчитать количество дней между двумя
датами...)))
...
Рейтинг: 0 / 0
22.12.2003, 09:45
    #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
22.12.2003, 09:49
    #32359287
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
А как нибудь менее громоздко можно это сделать???
...
Рейтинг: 0 / 0
22.12.2003, 09:49
    #32359288
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
char dt1[11]="01.01.2003";
char dt2[11]="31.12.2003";

long days=daycount(&dt1)-daycount(&dt2);
...
Рейтинг: 0 / 0
22.12.2003, 10:01
    #32359312
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
спасибо...))) щас попробую
...
Рейтинг: 0 / 0
22.12.2003, 12:54
    #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
22.12.2003, 13:50
    #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
22.12.2003, 14:05
    #32359665
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
тогда и в запресе юзай

DATEDIFF(d,bdate,edate)
____
...
Рейтинг: 0 / 0
22.12.2003, 14:09
    #32359671
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
JibSkeart
Этим он выдасть количество дней...???
...
Рейтинг: 0 / 0
22.12.2003, 14:10
    #32359674
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
да
____
...
Рейтинг: 0 / 0
22.12.2003, 16:18
    #32359933
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
те функции, которые я тут привел счетают количество дней от Рождества Христова. А то что касается DATEDIFF - такое дерьмо....(((
И вообще никто не работает с датами хуже чем MS SQL и Sybase
...
Рейтинг: 0 / 0
22.12.2003, 16:23
    #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
22.12.2003, 17:19
    #32360035
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
Найди разницу между 01.01.1615 и 01.01.2012 ?
...
Рейтинг: 0 / 0
22.12.2003, 18:08
    #32360107
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
gardenman
Ладно уговорил...будут погрешности...У меня просто разница максимум в год...)))
...
Рейтинг: 0 / 0
22.12.2003, 18:12
    #32360113
'FaTsO'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
Ой ошибся...
Мне не нужно считать сколько лет...мне именно скока дней...)))
...
Рейтинг: 0 / 0
24.12.2003, 10:46
    #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
24.12.2003, 11:04
    #32361743
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Количество дней между двумя датами???
2 gardenman

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

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

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

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


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