56 type(
dc_cal),
pointer:: calp =>null()
60 if ( calp % initialized )
return 63 calp % month_in_year = 12
64 calp % hour_in_day = 24
65 calp % min_in_hour = 60
66 calp % sec_in_min = 60.0_dp
67 allocate( calp % day_in_month(1:12) )
68 calp % day_in_month(1:12) = &
69 & (/ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /)
71 calp % initialized = .true.
110 integer,
intent(inout):: year
111 integer,
intent(inout):: month
112 integer,
intent(inout):: day
113 integer,
intent(inout):: hour
114 integer,
intent(inout):: min
115 real(DP),
intent(inout):: sec
116 type(
dc_cal),
intent(in):: cal
125 integer:: day_in_month_jg
126 integer,
pointer:: day_in_month(:) =>null()
131 integer:: month_in_year
133 integer:: hour_in_day
135 integer:: min_in_hour
137 real(DP):: sec_in_min
143 real(DP):: wyear, wday, whour, wmin
144 real(DP):: wdb, ychunk_e6, ychunk_e3, chunk_scale_e6, chunk_scale_e3
154 select case( cal % cal_type )
166 month_in_year = cal % month_in_year
167 hour_in_day = cal % hour_in_day
168 min_in_hour = cal % min_in_hour
169 sec_in_min = cal % sec_in_min
170 day_in_month => cal % day_in_month
172 select case( cal % cal_type )
174 chunk_scale_e6 = 4.0e+5
175 ychunk_e6 = 146100000.0_dp
177 chunk_scale_e3 = 4.0e+2
178 ychunk_e3 = 146100.0_dp
180 chunk_scale_e6 = 4.0e+5
181 ychunk_e6 = 146097000.0_dp
183 chunk_scale_e3 = 4.0e+2
184 ychunk_e3 = 146097.0_dp
186 chunk_scale_e6 = 1.0e+6
187 ychunk_e6 = chunk_scale_e6 * sum( day_in_month(:) )
189 chunk_scale_e3 = 1.0e+3
190 ychunk_e3 = chunk_scale_e3 * sum( day_in_month(:) )
196 wyear =
real( year,
dp )
197 wday =
real( day,
dp )
198 whour =
real( hour,
dp )
199 wmin =
real( min,
dp )
205 if ( .not. sec < sec_in_min )
then 206 wmin = wmin + aint( sec / sec_in_min )
207 sec = mod( sec, sec_in_min )
208 elseif ( sec < 0.0_dp )
then 209 wdb = ceiling( abs(sec) / sec_in_min )
211 sec = sec + wdb * sec_in_min
217 if ( .not. wmin < min_in_hour )
then 218 whour = whour + aint( wmin / min_in_hour )
219 wmin = mod( wmin,
real( min_in_hour, DP ) )
220 elseif ( wmin < 0 )
then 221 wdb = ceiling( abs(wmin) /
real(min_in_hour) )
223 wmin = wmin + wdb * min_in_hour
229 if ( .not. whour < hour_in_day )
then 230 wday = wday + aint( whour / hour_in_day )
231 whour = mod( whour,
real( hour_in_day, DP ) )
232 elseif ( whour < 0 )
then 233 wdb = ceiling( abs(whour) /
real(hour_in_day) )
235 whour = whour + wdb * hour_in_day
241 if ( wday < 1.0_dp )
then 242 select case( cal % cal_type )
245 do while ( wday < 1.0_dp )
247 if ( wday < - ychunk_e6 )
then 248 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
249 wday = mod( wday, ychunk_e6 ) + ychunk_e6
252 if ( wday < 1.0_dp )
then 253 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
254 wday = mod( wday, ychunk_e3 ) + ychunk_e3
261 do while ( wday < 1.0_dp )
263 if ( wday < - ychunk_e6 )
then 264 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
265 wday = mod( wday, ychunk_e6 ) + ychunk_e6
268 if ( wday < 1.0_dp )
then 269 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
270 wday = mod( wday, ychunk_e3 ) + ychunk_e3
277 do while ( wday < 1.0_dp )
279 if ( wday < - ychunk_e6 )
then 280 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
281 wday = mod( wday, ychunk_e6 ) + ychunk_e6
284 if ( wday < 1.0_dp )
then 285 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
286 wday = mod( wday, ychunk_e3 ) + ychunk_e3
298 select case( cal % cal_type )
301 if ( wday > ychunk_e6 )
then 302 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
303 wday = mod( wday, ychunk_e6 )
306 if ( wday > ychunk_e3 )
then 307 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
308 wday = mod( wday, ychunk_e3 )
312 if ( month == 2 )
then 313 if ( mod( wyear, 4.0_dp ) == 0 )
then 319 day_in_month_jg = day_in_month(month)
322 if ( .not. wday > day_in_month_jg )
exit 324 wday = wday - day_in_month_jg
326 if ( month > month_in_year )
then 334 if ( wday > ychunk_e6 )
then 335 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
336 wday = mod( wday, ychunk_e6 )
339 if ( wday > ychunk_e3 )
then 340 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
341 wday = mod( wday, ychunk_e3 )
345 if ( month == 2 )
then 346 if ( mod( wyear, 400.0_dp ) == 0 )
then 348 elseif ( mod( wyear, 100.0_dp ) == 0 )
then 350 elseif ( mod( wyear, 4.0_dp ) == 0 )
then 356 day_in_month_jg = day_in_month(month)
359 if ( .not. wday > day_in_month_jg )
exit 361 wday = wday - day_in_month_jg
363 if ( month > month_in_year )
then 371 if ( wday > ychunk_e6 )
then 372 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
373 wday = mod( wday, ychunk_e6 )
376 if ( wday > ychunk_e3 )
then 377 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
378 wday = mod( wday, ychunk_e3 )
381 do while ( wday > day_in_month(month) )
382 wday = wday - day_in_month(month)
384 if ( month > month_in_year )
then 402 function dccaldate_ym2d( year, month, day, cal, day_of_year )
result(stat)
414 integer,
intent(in):: year
415 integer,
intent(in):: month
416 integer,
intent(in):: day
417 real(DP),
intent(out):: day_of_year
418 type(
dc_cal),
intent(in):: cal
438 select case( cal % cal_type )
450 day_of_year =
real( day,
dp )
455 select case( cal % cal_type )
460 if ( mod( year, 4 ) == 0 )
then 461 day_of_year = day_of_year + 29
463 day_of_year = day_of_year + 28
466 day_of_year = day_of_year + cal % day_in_month(i)
474 if ( mod( year, 400 ) == 0 )
then 475 day_of_year = day_of_year + 29
476 elseif ( mod( year, 100 ) == 0 )
then 477 day_of_year = day_of_year + 28
478 elseif ( mod( year, 4 ) == 0 )
then 479 day_of_year = day_of_year + 29
481 day_of_year = day_of_year + 28
484 day_of_year = day_of_year + cal % day_in_month(i)
492 day_of_year = day_of_year + cal % day_in_month(i)
510 character(TOKEN):: str
511 integer,
intent(in):: cal_type
517 select case( cal_type )
524 case default ; str =
' ' 552 character(*),
intent(in):: str
553 character(TOKEN):: unit
554 integer :: unit_str_size, i
559 do i = 1, unit_str_size
567 do i = 1, unit_str_size
575 do i = 1, unit_str_size
583 do i = 1, unit_str_size
591 do i = 1, unit_str_size
599 do i = 1, unit_str_size
643 character(*),
intent(in):: str
645 integer:: unit_str_size, i
646 character(TOKEN):: unit
651 do i = 1, unit_str_size
659 do i = 1, unit_str_size
667 do i = 1, unit_str_size
675 do i = 1, unit_str_size
683 do i = 1, unit_str_size
691 do i = 1, unit_str_size
integer, parameter, public cal_gregorian
integer, parameter, public unit_symbol_hour
character(*), dimension(4), parameter, public unit_year
integer, parameter, public cal_julian
integer, parameter, public unit_symbol_month
character(*), dimension(8), parameter, public unit_sec
integer, parameter, public cal_user_defined
integer, parameter, public cal_noleap
character(*), dimension(4), parameter, public unit_day
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
type(dc_cal), target, save, public default_cal
character(token) function, public dccaltype_str(cal_type)
character(*), dimension(4), parameter, public unit_min
integer, parameter, public unit_symbol_year
integer, parameter, public dc_noerr
integer function, public dccaldate_ym2d(year, month, day, cal, day_of_year)
integer, parameter, public unit_symbol_day
integer function, public dccaldate_normalize(year, month, day, hour, min, sec, cal)
character(token) function, public dccaldate_str2ustr(str)
integer, parameter, public cal_360day
type(dc_cal_date), target, save, public default_date
integer, parameter, public dp
倍精度実数型変数
integer, parameter, public dc_einconsistcaldate
integer, parameter, public unit_symbol_err
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
character(*), dimension(6), parameter, public unit_month
character(*), dimension(8), parameter, public unit_hour