!== dc_date_types#DC_DATETIME, dc_date_types#DC_DIFFTIME 型変数の文字変換 ! ! Authors:: Yasuhiro MORIKAWA ! Version:: $Id: dcdatetimetochar.f90,v 1.4 2006/12/25 14:28:35 morikawa Exp $ ! Tag Name:: $Name: gt4f90io-20070116 $ ! Copyright:: Copyright (C) GFD Dennou Club, 2006-. All rights reserved. ! License:: See COPYRIGHT[link:../../COPYRIGHT] ! ! このファイルで提供される手続き群は dc_date モジュールにて提供されます。 ! function DCDateTimeToChar(time) result(result) ! ! dc_date_types#DC_DATETIME 型変数を文字型変数へ変換して返します. ! 書式は下記のように JIS X 0301 の完全表記です. ! ! YYYY-MM-DDThh:mm:ss.sTZD ! ! YYYY は年, MM は月, DD は日, hh は時, mm は分, ss.s は秒, ! TZD はタイムゾーンを表します. ! use dc_types, only: STRING, TOKEN, DP use dc_string, only: toChar, CPrintf, StoA use dc_date, only: Eval use dc_date_types, only: DC_DATETIME, & & MIN_SECONDS, HOUR_SECONDS, YEAR_MONTHS use dc_message, only: MessageNotify implicit none character(STRING):: result type(DC_DATETIME), intent(in):: time integer :: year, mon, day, hour, min, csec_len real(DP):: sec character(TOKEN) :: zone, csec continue call Eval(time, & & year=year, mon=mon, day=day, hour=hour, min=min, sec=sec, zone=zone) csec = toChar(sec) if (int(sec) > -1 .and. int(sec) < 10) csec = '0' // csec csec_len = len(trim(adjustl(csec))) if (csec(csec_len:csec_len) == '.') csec = csec(1:csec_len-1) result = CPrintf('%04d-%02d-%02dT%02d:%02d:%c%c', & & i=(/year, mon, day, hour, min/), & & c1=trim(csec), c2=trim(zone)) end function DCDateTimeToChar function DCDiffTimeToChar(diff) result(result) ! ! dc_date_types#DC_DIFFTIME 型変数を文字型変数へ変換して返します. ! 書式は以下のようになります. ! ! YYYY-MM-DDThh:mm:ss.s ! ! YYYY は年, MM は月, DD は日, hh は時, mm は分, ss.s は秒を表します. ! ただし, DD は 2 桁を超える場合があります. ! (dc_date_types#DC_DIFFTIME は X ヶ月後, X 日前, などを表現するため ! のデータ型なので, 日を月に繰り上げたり, 月を日に繰り下げることを ! しません. また「年」の情報も持ちません. 1 年の日数や 1 月の日数は ! dc_date_types#DC_DATETIME 側で決まります). ! use dc_types, only: STRING, TOKEN, DP use dc_string, only: toChar, CPrintf, StoA use dc_date, only: Eval use dc_date_types, only: DC_DIFFTIME implicit none character(STRING):: result type(DC_DIFFTIME), intent(in):: diff integer :: year, mon, day, hour, min, csec_len real(DP):: sec character(TOKEN) :: csec continue call Eval(diff, year=year, mon=mon, day=day, hour=hour, min=min, sec=sec) csec = toChar(sec) if (int(sec) > -1 .and. int(sec) < 10) csec = '0' // csec csec_len = len(trim(adjustl(csec))) if (csec(csec_len:csec_len) == '.') csec = csec(1:csec_len-1) result = CPrintf('%04d-%02d-%02dT%02d:%02d:%c', & & i=(/year, mon, day, hour, min/), & & c1=trim(csec)) end function DCDiffTimeToChar