!== 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