Mapper
days_diff.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <math.h>
6 #include <sys/time.h>
7 
8 /* function to a date/time by a specified number of hours */
9 
10 int adj_time(int adj, int y, int m, int d, int h,
11  int *adj_y, int *adj_m, int *adj_d, int *adj_h)
12 {
13 
14 int y1,m1,d1,h1;
15 
16  while(adj < -24)
17  {
18  adj_time(-24,y,m,d,h,&y1,&m1,&d1,&h1);
19  y=y1;m=m1;d=d1;h=h1;
20  adj=adj+24;
21  }
22 
23  while (adj > 24)
24  {
25  adj_time(24,y,m,d,h,&y1,&m1,&d1,&h1);
26  y=y1;m=m1;d=d1;h=h1;
27  adj=adj-24;
28  }
29 
30  h=h+adj;
31 
32  if(h > 23)
33  {
34  h=h-24;
35  d++;
36  if((m == 1 || m == 3 || m == 5 || m == 7 ||
37  m == 8 || m == 10 || m == 12 ) && d > 31)
38  {
39  d=1;
40  m++;
41  if(m > 12)
42  {
43  m=1;
44  y++;
45  }
46  }
47  if((m == 4 || m == 6 || m == 9 || m == 11)
48  && d > 30)
49  {
50  d=1;
51  m++;
52  }
53 
54  if(m == 2 && (((y%4) && d > 28) || (!(y%4) && d > 29)))
55  {
56  d=1;
57  m++;
58  }
59  }
60  if(h < 0)
61  {
62  h=h+24;
63  d--;
64  if(d < 1)
65  {
66  m--;
67  if(m == 0)
68  {
69  m=12;
70  y--;
71  }
72  if(m == 1 || m == 3 || m == 5 || m == 7 ||
73  m == 8 || m == 10 || m == 12 ) d=31;
74  if(m == 4 || m == 6 || m == 9 || m == 11) d=30;
75  if(m == 2 && y%4) d=28;
76  if(m == 2 && !(y%4)) d=29;
77  }
78  }
79 
80  *adj_h=h;
81  *adj_d=d;
82  *adj_m=m;
83  *adj_y=y;
84  return(0);
85 }
86 
87 /* function to identify zulu to local time offset */
88 int z2loc(int yy,int mm,int dd,int hh)
89 {
90 FILE *pf, *popen();
91 char day[80];
92 char line1[80];
93 int day_num;
94 int daylight=-7;
95 int standard=-8;
96 
97  if(mm>=4 && mm<=10)
98  return(daylight);
99  if(mm>=12 || mm<=2)
100  return(standard);
101 
102  /* get day number */
103  sprintf(line1,"date +\'%w\' -d \'%02d/%02d/%04d %02d:00\'",mm,dd,yy,hh);
104  pf=popen(line1,"r");
105  fgets(day,sizeof(day),pf);
106  pclose(pf);
107  sscanf(day,"%d",&day_num);
108  if(!day_num) day_num=7;;
109 
110  /* November, 1st Sunday*/
111  if(mm==11)
112  {
113  if(dd>=8)
114  return(standard);
115  if(day_num==7)
116  {
117  if(hh>=10)
118  return(standard);
119  else
120  return(daylight);
121  }
122  else
123  {
124  if(day_num-dd<=0)
125  return(standard);
126  else
127  return(daylight);
128  }
129  }
130 
131  /* March, second Sunday */
132  if(mm==3)
133  {
134  if(dd<=7)
135  return(standard);
136  if(dd >=15)
137  return(daylight);
138  if(day_num==7)
139  {
140  if(hh>=10)
141  return(daylight);
142  else
143  return(standard);
144  }
145  else
146  {
147  if(day_num-dd>=-7)
148  return(standard);
149  else
150  return(daylight);
151  }
152  }
153  return(0);
154 }
int z2loc(int yy, int mm, int dd, int hh)
Definition: days_diff.c:88
int adj_time(int adj, int y, int m, int d, int h, int *adj_y, int *adj_m, int *adj_d, int *adj_h)
Definition: days_diff.c:10
int day
Definition: display_data.c:26
sprintf(fbuf,"/usr/mapper/nexrad/ngrid.%02d-%02d-%02d-%02d", year, month, day, hour)
double yy
Definition: mapp2h.h:41