51 type(
dc_cal),
intent(in),
optional,
target:: cal
60 type(
dc_cal),
pointer:: calp =>null()
61 real(DP):: start_year, start_day, start_sec, start_neg_offset_day
62 real(DP):: end_year, end_day, end_sec, end_neg_offset_day
63 integer:: day_in_4years, day_in_400years
64 integer:: start_year_int, end_year_int
66 character(*),
parameter:: subname =
'DCCalDateDifference1' 71 if (
present( cal ) )
then 81 if ( .not. calp % initialized )
then 86 if ( .not. start_date % initialized )
then 91 if ( .not. end_date % initialized )
then 96 start_neg_offset_day = 0
97 end_neg_offset_day = 0
99 start_year_int = start_date % year
100 end_year_int = end_date % year
105 select case( calp % cal_type )
112 do while ( start_year_int < 1 )
113 start_neg_offset_day = start_neg_offset_day &
114 & + day_in_4years * 100
115 start_year_int = start_year_int &
122 if ( ( start_year_int - 1 ) > 4 )
then 123 start_day = int( ( start_year_int - 1 ) / 4 ) * day_in_4years
124 start_year = mod( start_year_int - 1, 4 ) + 1
127 start_year = start_year_int
130 start_day = start_day + ( start_year - 1 ) * sum( calp % day_in_month(:) )
131 do i = 1, start_date % month - 1
132 if ( start_year == 4 .and. i == 2 )
then 133 start_day = start_day + 29
135 start_day = start_day + calp % day_in_month(i)
138 start_day = start_day + start_date % day
142 do while ( end_year_int < 1 )
143 end_neg_offset_day = end_neg_offset_day &
144 & + day_in_4years * 100
145 end_year_int = end_year_int &
152 if ( ( end_year_int - 1 ) > 4 )
then 153 end_day = int( ( end_year_int - 1 ) / 4 ) * day_in_4years
154 end_year = mod( end_year_int - 1, 4 ) + 1
157 end_year = end_year_int
160 end_day = end_day + ( end_year - 1 ) * sum ( calp % day_in_month(:) )
161 do i = 1, end_date % month - 1
162 if ( end_year == 4 .and. i == 2 )
then 163 end_day = end_day + 29
165 end_day = end_day + calp % day_in_month(i)
168 end_day = end_day + end_date % day
172 day_in_400years = 146097
176 do while ( start_year_int < 1 )
177 start_neg_offset_day = start_neg_offset_day &
179 start_year_int = start_year_int &
186 if ( ( start_year_int - 1 ) > 400 )
then 187 start_day = int( ( start_year_int - 1 ) / 400 ) * day_in_400years
188 start_year = mod( start_year_int - 1, 400 ) + 1
191 start_year = start_year_int
194 do j = 1, int( start_year - 1 )
195 do i = 1, calp % month_in_year
197 if ( mod( j, 400 ) == 0 )
then 198 start_day = start_day + 29
199 elseif ( mod( j, 100 ) == 0 )
then 200 start_day = start_day + 28
201 elseif ( mod( j, 4 ) == 0 )
then 202 start_day = start_day + 29
204 start_day = start_day + 28
207 start_day = start_day + calp % day_in_month(i)
212 do i = 1, start_date % month - 1
214 if ( mod( start_year, 400.0_dp ) == 0 )
then 215 start_day = start_day + 29
216 elseif ( mod( start_year, 100.0_dp ) == 0 )
then 217 start_day = start_day + 28
218 elseif ( mod( start_year, 4.0_dp ) == 0 )
then 219 start_day = start_day + 29
221 start_day = start_day + 28
224 start_day = start_day + calp % day_in_month(i)
228 start_day = start_day + start_date % day
232 do while ( end_year_int < 1 )
233 end_neg_offset_day = end_neg_offset_day &
235 end_year_int = end_year_int &
242 if ( ( end_year_int - 1 ) > 400 )
then 243 end_day = int( ( end_year_int - 1 ) / 400 ) * day_in_400years
244 end_year = mod( end_year_int - 1, 400 ) + 1
247 end_year = end_year_int
250 do j = 1, int( end_year - 1 )
251 do i = 1, calp % month_in_year
253 if ( mod( j, 400 ) == 0 )
then 254 end_day = end_day + 29
255 elseif ( mod( j, 100 ) == 0 )
then 256 end_day = end_day + 28
257 elseif ( mod( j, 4 ) == 0 )
then 258 end_day = end_day + 29
260 end_day = end_day + 28
263 end_day = end_day + calp % day_in_month(i)
268 do i = 1, end_date % month - 1
270 if ( mod( end_year, 400.0_dp ) == 0 )
then 271 end_day = end_day + 29
272 elseif ( mod( end_year, 100.0_dp ) == 0 )
then 273 end_day = end_day + 28
274 elseif ( mod( end_year, 4.0_dp ) == 0 )
then 275 end_day = end_day + 29
277 end_day = end_day + 28
280 end_day = end_day + calp % day_in_month(i)
284 end_day = end_day + end_date % day
290 start_day = ( start_year_int - 1 ) * sum( calp % day_in_month(:) )
291 do i = 1, start_date % month - 1
292 start_day = start_day + calp % day_in_month(i)
294 start_day = start_day + start_date % day
299 end_day = ( end_year_int - 1 ) * sum ( calp % day_in_month(:) )
300 do i = 1, end_date % month - 1
301 end_day = end_day + calp % day_in_month(i)
303 end_day = end_day + end_date % day
309 start_sec = ( start_day - 1 - start_neg_offset_day ) &
310 & * calp % hour_in_day &
311 & * calp % min_in_hour &
312 & * calp % sec_in_min &
313 & + start_date % hour * calp % min_in_hour &
314 & * calp % sec_in_min &
315 & + start_date % min * calp % sec_in_min &
321 end_sec = ( end_day - 1 - end_neg_offset_day ) &
322 & * calp % hour_in_day &
323 & * calp % min_in_hour &
324 & * calp % sec_in_min &
325 & + end_date % hour * calp % min_in_hour &
326 & * calp % sec_in_min &
327 & + end_date % min * calp % sec_in_min &
333 sec = end_sec - start_sec
integer, parameter, public cal_gregorian
integer, parameter, public unit_symbol_hour
integer, parameter, public cal_julian
integer, parameter, public unit_symbol_month
integer, parameter, public dc_enotinit
integer, parameter, public cal_user_defined
integer, parameter, public cal_noleap
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
type(dc_cal), target, save, public default_cal
character(token) function, public dccaltype_str(cal_type)
integer, parameter, public unit_symbol_year
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_noerr
integer, parameter, public unit_symbol_day
integer, parameter, public cal_360day
integer, parameter, public dp
倍精度実数型変数
subroutine, public beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, version)
integer, parameter, public dc_ebadunit
integer, parameter, public cal_cyclic
integer, parameter, public unit_symbol_min
integer function, public dccaldate_str2usym(str)
subroutine, public default_cal_set
integer, parameter, public unit_symbol_sec
subroutine, public endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ