-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdateadd.c
63 lines (51 loc) · 1.42 KB
/
dateadd.c
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
#include <stdio.h>
#include <stdlib.h>
long dateToInt( int, int, int );
int* intToDate( long );
int main( int argc, char* argv[] ) {
char buf;
//date[0]=year, date[1]=month, date[2]=day
char date[3][5];
for( int i = 0, j = 0, k = 0; argv[ 1 ][ k ] != '\0'; ++k ) {
switch( argv[ 1 ][ k ] ) {
case '-':
date[ j ][ i ] = '\0';
i = 0;
++j;
break;
default:
date[ j ][ i ] = argv[ 1 ][ k ];
++i;
date[ j ][ i ] = '\0';
break;
}
}
int d = atoi( date[ 2 ] );
int m = atoi( date[ 1 ] );
int y = atoi( date[ 0 ] );
int off = atoi( argv[ 2 ] );
int* res = intToDate( dateToInt( y, m, d ) + off );
printf( "%d-%02d-%02d", res[ 0 ], res[ 1 ], res[ 2 ] );
return 0;
}
long dateToInt( int y, int m, int d ) {
m = ( m + 9 ) % 12;
y = y - m/10;
return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + (d-1);
}
int* intToDate( long g ) {
int* res = malloc( 3 * sizeof(int) );
int y, mm, dd;
y = (10000*g + 14780)/3652425;
int ddd = g - (365*y + y/4 - y/100 + y/400);
if (ddd < 0) {
y = y - 1;
ddd = g - (365*y + y/4 - y/100 + y/400);
}
int mi = (100*ddd + 52)/3060;
mm = (mi + 2)%12 + 1;
y = y + (mi + 2)/12;
dd = ddd - (mi*306 + 5)/10 + 1;
res[ 0 ] = y; res[ 1 ] = mm; res[ 2 ] = dd;
return res;
}