| Path: | dcdatetimetochar.f90 |
| Last Update: | Tue Sep 23 18:56:35 +0900 2008 |
| Authors: | Yasuhiro MORIKAWA |
| Version: | $Id: dcdatetimetochar.f90,v 1.1.1.1 2008-09-23 09:56:35 morikawa Exp $ |
| Tag Name: | $Name: gtool5-20080923-2 $ |
| Copyright: | Copyright (C) GFD Dennou Club, 2006-. All rights reserved. |
| License: | See COPYRIGHT |
このファイルで提供される手続き群は dc_date モジュールにて提供されます。
| Function : | |
| result : | character(STRING) |
| time : | type(DC_DATETIME), intent(in) |
dc_date_types#DC_DATETIME 型変数を文字型変数へ変換して返します. 書式は下記のように JIS X 0301 の完全表記です.
YYYY-MM-DDThh:mm:ss.sTZD
YYYY は年, MM は月, DD は日, hh は時, mm は分, ss.s は秒, TZD はタイムゾーンを表します.
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 ( trim(csec) == '-0.' ) csec = '0.'
do while ( index('123456789.', csec(len_trim(csec):len_trim(csec)) ) == 0 )
if ( len_trim(csec) < 2 ) exit
csec = csec(1:len_trim(csec)-1)
end do
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 : | |
| result : | character(STRING) |
| diff : | type(DC_DIFFTIME), intent(in) |
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 側で決まります).
なお, DCDiffTimeCreate において, 単位を ‘1’ とした場合は無時限時間と 扱うため, 以下のような書式となります.
ss.s
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 側で決まります).
!
! なお, DCDiffTimeCreate において, 単位を '1' とした場合は無時限時間と
! 扱うため, 以下のような書式となります.
!
! ss.s
!
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
use dc_scaledsec, only: assignment(=)
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
if ( .not. diff % nondim_flag ) then
call Eval(diff, year=year, mon=mon, day=day, hour=hour, min=min, sec=sec)
csec = toChar(sec)
if ( trim(csec) == '-0.' ) csec = '0.'
do while ( index('123456789.', csec(len_trim(csec):len_trim(csec)) ) == 0 )
if ( len_trim(csec) < 2 ) exit
csec = csec(1:len_trim(csec)-1)
end do
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))
else
sec = diff % sec
result = toChar( sec )
end if
end function DCDiffTimeToChar