!== dcdatetimeeval.f90 - dc_date_types#DC_DATETIME 型変数から月日秒への変換
!
! Authors:: Yasuhiro MORIKAWA, Eizi TOYODA
! Version:: $Id: dcdatetimeeval.f90,v 1.2 2005/12/26 11:34:38 morikawa Exp $
! Tag Name:: $Name: gt4f90io-20060627 $
! Copyright:: Copyright (C) GFD Dennou Club, 2000-2005. All rights reserved.
! License:: See COPYRIGHT[link:../../COPYRIGHT]
!
! このファイルで提供される手続き群は dc_date モジュールにて提供されます。
!
subroutine DCDateTimeEval(time, mon, day, sec) !:nodoc:,2
!
! dc_date_types#DC_DATETIME 型変数の time を
! 整数型変数である 月 mon 、 日 day 、 および倍精度実数型である
! 秒 sec に変換して返す。
!
! dc_date#DateTime の逆操作。
!
!--
! このサブルーチンは暦法 (1 年が何日か? 1 日は何秒か?) を知っています。
! ですが、もしかすると、dc_data_types 内の変数を用いるべきかもしれません。
!++
use dc_types
, only: DP
use dc_date_types
, only: DC_DATETIME, &
& caltype, cyclic_mdays, CAL_NOLEAP, CAL_JULIAN, CAL_CYCLIC
implicit none
type(DC_DATETIME), intent(in):: time
integer, intent(out):: mon, day
real(DP), intent(out):: sec
integer:: year, month
integer, parameter:: four_years = 365 * 4 + 1
integer, parameter:: four_century = 365 * 400 + 97
continue
sec = time%sec
if (caltype == CAL_CYCLIC) then
day = modulo(dble(time%day - 1), cyclic_mdays) + 1
mon = (time%day - 1) / cyclic_mdays
return
endif
if (caltype == CAL_NOLEAP) then
day = modulo(time%day - 91, 365)
year = (time%day - 91 - day) / 365
else
if (caltype == CAL_JULIAN .or. time%day < 640196) then
day = modulo(time%day - 92, four_years)
year = (time%day - 92 - day) / four_years * 4
else
day = modulo(time%day - 94, four_century)
year = (time%day - 94 - day) / four_century * 400
if (day == four_century - 1) then
year = year + 300
day = 36525
else
year = year + day / 36524 * 100
day = modulo(day, 36524)
endif
year = year + day / four_years * 4
day = modulo(day, four_years)
endif
if (day == four_years - 1) then
year = year + 3
day = 365
else
year = year + day / 365
day = modulo(day, 365)
endif
endif
day = day * 10 + 922
month = day / 306
mon = mod(month - 1, 12) + 1
year = year + (month - mon) / 12
day = mod(day, 306) / 10 + 1
end subroutine DCDateTimeEval