日時差を算出します.
53
58 implicit none
59 real(DP):: sec
60 type(DC_CAL_DATE), intent(in):: start_date
61 type(DC_CAL_DATE), intent(in):: end_date
62 type(DC_CAL), intent(in), optional, target:: cal
63
64
65
66
67 type(DC_CAL), pointer:: calp =>null()
68 real(DP):: start_year, start_day, start_sec, start_neg_offset_day
69 real(DP):: end_year, end_day, end_sec, end_neg_offset_day
70 integer:: day_in_4years, day_in_400years
71 integer:: start_year_int, end_year_int
72 integer:: i, j
73continue
74
75
76
77 if ( present( cal ) ) then
78 calp => cal
79 else
82 end if
83
84
85
86
87 if ( .not. calp % initialized ) then
88 sec = 0.0_dp
89 return
90 end if
91
92 if ( .not. start_date % initialized ) then
93 sec = 0.0_dp
94 return
95 end if
96
97 if ( .not. end_date % initialized ) then
98 sec = 0.0_dp
99 return
100 end if
101
102 start_neg_offset_day = 0
103 end_neg_offset_day = 0
104
105 start_year_int = start_date % year
106 end_year_int = end_date % year
107
108
109
110
111 select case( calp % cal_type )
113
114 day_in_4years = 1461
115
116
117
118 do while ( start_year_int < 1 )
119 start_neg_offset_day = start_neg_offset_day &
120 & + day_in_4years * 100
121 start_year_int = start_year_int &
122 & + 400
123 end do
124
125
126
127
128 if ( ( start_year_int - 1 ) > 4 ) then
129 start_day = int( ( start_year_int - 1 ) / 4 ) * day_in_4years
130 start_year = mod( start_year_int - 1, 4 ) + 1
131 else
132 start_day = 0
133 start_year = start_year_int
134 end if
135
136 start_day = start_day + ( start_year - 1 ) * sum( calp % day_in_month(:) )
137 do i = 1, start_date % month - 1
138 if ( int(start_year) == 4 .and. i == 2 ) then
139 start_day = start_day + 29
140 else
141 start_day = start_day + calp % day_in_month(i)
142 end if
143 end do
144 start_day = start_day + start_date % day
145
146
147
148 do while ( end_year_int < 1 )
149 end_neg_offset_day = end_neg_offset_day &
150 & + day_in_4years * 100
151 end_year_int = end_year_int &
152 & + 400
153 end do
154
155
156
157
158 if ( ( end_year_int - 1 ) > 4 ) then
159 end_day = int( ( end_year_int - 1 ) / 4 ) * day_in_4years
160 end_year = mod( end_year_int - 1, 4 ) + 1
161 else
162 end_day = 0
163 end_year = end_year_int
164 end if
165
166 end_day = end_day + ( end_year - 1 ) * sum( calp % day_in_month(:) )
167 do i = 1, end_date % month - 1
168 if ( int(end_year) == 4 .and. i == 2 ) then
169 end_day = end_day + 29
170 else
171 end_day = end_day + calp % day_in_month(i)
172 end if
173 end do
174 end_day = end_day + end_date % day
175
177
178 day_in_400years = 146097
179
180
181
182 do while ( start_year_int < 1 )
183 start_neg_offset_day = start_neg_offset_day &
184 & + day_in_400years
185 start_year_int = start_year_int &
186 & + 400
187 end do
188
189
190
191
192 if ( ( start_year_int - 1 ) > 400 ) then
193 start_day = int( ( start_year_int - 1 ) / 400 ) * day_in_400years
194 start_year = mod( start_year_int - 1, 400 ) + 1
195 else
196 start_day = 0
197 start_year = start_year_int
198 end if
199
200 do j = 1, int( start_year - 1 )
201 do i = 1, calp % month_in_year
202 if ( i == 2 ) then
203 if ( mod( j, 400 ) == 0 ) then
204 start_day = start_day + 29
205 elseif ( mod( j, 100 ) == 0 ) then
206 start_day = start_day + 28
207 elseif ( mod( j, 4 ) == 0 ) then
208 start_day = start_day + 29
209 else
210 start_day = start_day + 28
211 end if
212 else
213 start_day = start_day + calp % day_in_month(i)
214 end if
215 end do
216 end do
217
218 do i = 1, start_date % month - 1
219 if ( i == 2 ) then
220 if ( mod( int(start_year), 400 ) == 0 ) then
221 start_day = start_day + 29
222 elseif ( mod( int(start_year), 100 ) == 0 ) then
223 start_day = start_day + 28
224 elseif ( mod( int(start_year), 4 ) == 0 ) then
225 start_day = start_day + 29
226 else
227 start_day = start_day + 28
228 end if
229 else
230 start_day = start_day + calp % day_in_month(i)
231 end if
232 end do
233
234 start_day = start_day + start_date % day
235
236
237
238 do while ( end_year_int < 1 )
239 end_neg_offset_day = end_neg_offset_day &
240 & + day_in_400years
241 end_year_int = end_year_int &
242 & + 400
243 end do
244
245
246
247
248 if ( ( end_year_int - 1 ) > 400 ) then
249 end_day = int( ( end_year_int - 1 ) / 400 ) * day_in_400years
250 end_year = mod( end_year_int - 1, 400 ) + 1
251 else
252 end_day = 0
253 end_year = end_year_int
254 end if
255
256 do j = 1, int( end_year - 1 )
257 do i = 1, calp % month_in_year
258 if ( i == 2 ) then
259 if ( mod( j, 400 ) == 0 ) then
260 end_day = end_day + 29
261 elseif ( mod( j, 100 ) == 0 ) then
262 end_day = end_day + 28
263 elseif ( mod( j, 4 ) == 0 ) then
264 end_day = end_day + 29
265 else
266 end_day = end_day + 28
267 end if
268 else
269 end_day = end_day + calp % day_in_month(i)
270 end if
271 end do
272 end do
273
274 do i = 1, end_date % month - 1
275 if ( i == 2 ) then
276 if ( mod( int(end_year), 400 ) == 0 ) then
277 end_day = end_day + 29
278 elseif ( mod( int(end_year), 100 ) == 0 ) then
279 end_day = end_day + 28
280 elseif ( mod( int(end_year), 4 ) == 0 ) then
281 end_day = end_day + 29
282 else
283 end_day = end_day + 28
284 end if
285 else
286 end_day = end_day + calp % day_in_month(i)
287 end if
288 end do
289
290 end_day = end_day + end_date % day
291
292 case default
293
294
295
296 start_day = ( start_year_int - 1 ) * sum( calp % day_in_month(:) )
297 do i = 1, start_date % month - 1
298 start_day = start_day + calp % day_in_month(i)
299 end do
300 start_day = start_day + start_date % day
301
302
303
304
305 end_day = ( end_year_int - 1 ) * sum( calp % day_in_month(:) )
306 do i = 1, end_date % month - 1
307 end_day = end_day + calp % day_in_month(i)
308 end do
309 end_day = end_day + end_date % day
310 end select
311
312
313
314
315 start_sec = ( start_day - 1 - start_neg_offset_day ) &
316 & * calp % hour_in_day &
317 & * calp % min_in_hour &
318 & * calp % sec_in_min &
319 & + start_date % hour * calp % min_in_hour &
320 & * calp % sec_in_min &
321 & + start_date % min * calp % sec_in_min &
322 & + start_date % sec
323
324
325
326
327 end_sec = ( end_day - 1 - end_neg_offset_day ) &
328 & * calp % hour_in_day &
329 & * calp % min_in_hour &
330 & * calp % sec_in_min &
331 & + end_date % hour * calp % min_in_hour &
332 & * calp % sec_in_min &
333 & + end_date % min * calp % sec_in_min &
334 & + end_date % sec
335
336
337
338
339 sec = end_sec - start_sec
340
341
342
343
344 nullify( calp )
type(dc_cal), target, save, public default_cal
デフォルトの暦. DCCal で始まる手続のうち, DC_CAL 型の省略可能引数が与えられない 場合にはこの暦が設定もしくは利用される.
subroutine, public default_cal_set
integer, parameter, public cal_julian
integer, parameter, public cal_gregorian
integer, parameter, public dp
倍精度実数型変数