gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
dcdatetimetochar.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

character(string) function dcdatetimetochar (time)
 dc_date_types#DC_DATETIME, dc_date_types#DC_DIFFTIME 型変数の文字変換
character(string) function dcdifftimetochar (diff)
character(token) function dcdatetimetocharcal (time, upcase)

Function/Subroutine Documentation

◆ dcdatetimetochar()

character(string) function dcdatetimetochar ( type(dc_datetime), intent(in) time)

dc_date_types#DC_DATETIME, dc_date_types#DC_DIFFTIME 型変数の文字変換

Author
Yasuhiro MORIKAWA

このファイルで提供される手続き群は dc_date モジュールにて提供されます。

DC_DATETIME を文字列に変換

dc_date_types#DC_DATETIME 型変数を文字型変数へ変換して返します. 書式は下記のように JIS X 0301 の完全表記です.

YYYY-MM-DDThh:mm:ss.sTZD

YYYY は年, MM は月, DD は日, hh は時, mm は分, ss.s は秒, TZD はタイムゾーンを表します.

Parameters
[in]time変換する日時
Returns
日時の文字列表現

Definition at line 52 of file dcdatetimetochar.f90.

53
54 use dc_types, only: string, token, dp
55 use dc_string, only: tochar, cprintf, stoa
56 use dc_date_generic, only: eval
57 use dc_date_types, only: dc_datetime
58 use dc_message, only: messagenotify
59 implicit none
60 character(STRING):: result
61 type(DC_DATETIME), intent(in):: time
62
63 integer :: year, mon, day, hour, min, csec_len
64 real(DP):: sec
65 character(TOKEN) :: zone
66 character(STRING) :: csec
67continue
68
69 call eval(time, &
70 & year=year, mon=mon, day=day, hour=hour, min=min, sec=sec, zone=zone)
71
72 csec = tochar(sec)
73 if ( trim(csec) == '-0.' ) csec = '0.'
74 do while ( index('123456789.', csec(len_trim(csec):len_trim(csec)) ) == 0 )
75 if ( len_trim(csec) < 2 ) exit
76 csec = csec(1:len_trim(csec)-1)
77 end do
78 if (int(sec) > -1 .and. int(sec) < 10) then
79 if (len_trim(csec) >= len(csec)) then
80 csec = '0' // trim(csec(1:len(csec) - 1))
81 else
82 csec = '0' // trim(csec)
83 end if
84 end if
85 csec_len = len(trim(adjustl(csec)))
86 if (csec(csec_len:csec_len) == '.') csec = csec(1:csec_len-1)
87
88 result = cprintf('%04d-%02d-%02dT%02d:%02d:%c%c', &
89 & i=(/year, mon, day, hour, min/), &
90 & c1=trim(csec), c2=trim(zone))
91
dc_date より提供される手続の引用仕様宣言
日付・時刻に関する構造データ型と定数
メッセージの出力
文字型変数の操作
Definition dc_string.f90:83
種別型パラメタを提供します。
Definition dc_types.f90:55
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
Definition dc_types.f90:128
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition dc_types.f90:137
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:92

References dc_types::dp, dc_types::string, and dc_types::token.

◆ dcdatetimetocharcal()

character(token) function dcdatetimetocharcal ( type(dc_datetime), intent(in) time,
logical, intent(in), optional upcase )

DC_DATETIME の暦タイプを文字列に変換

dc_date_types#DC_DATETIME 型変数の暦を文字型にして返します. 現在サポートされている暦は以下の通りです. 左が暦を示す整数型変数, 右が返る文字列です. upcase に .true. を与えた場合には, 大文字となって返ります.

暦タイプ定数 返る文字列
dc_date_types#CAL_CYCLIC cyclic
dc_date_types#CAL_NOLEAP noleap
dc_date_types#CAL_JULIAN julian
dc_date_types#CAL_GREGORIAN gregorian
Parameters
[in]time暦タイプを変換する日時
[in]upcase.true. なら大文字で返す
Returns
暦タイプの文字列表現

Definition at line 243 of file dcdatetimetochar.f90.

244
245 use dc_types, only: token
247 use dc_date_types, only: dc_datetime, &
249 use dc_string, only: toupper
250 character(TOKEN) :: result
251 type(DC_DATETIME), intent(in):: time
252 logical, intent(in), optional:: upcase
253continue
254 select case( time % caltype )
255 case(cal_cyclic)
256 result = 'cyclic'
257 case(cal_noleap)
258 result = 'noleap'
259 case(cal_julian)
260 result = 'julian'
261 case(cal_gregorian)
262 result = 'gregorian'
263 case default
264 result = 'none'
265 end select
266
267 if ( present_and_true(upcase) ) then
268 call toupper(result) ! (inout)
269 end if
270
integer, parameter, public cal_noleap
閏年無しの暦 (1年 365 日)
integer, parameter, public cal_cyclic
周期暦 (1ヶ月 30.6 日)
integer, parameter, public cal_gregorian
グレゴリオ暦
integer, parameter, public cal_julian
ユリウス暦
省略可能な制御パラメータの判定
logical function, public present_and_true(arg)

References dc_date_types::cal_cyclic, dc_date_types::cal_gregorian, dc_date_types::cal_julian, dc_date_types::cal_noleap, dc_present::present_and_true(), and dc_types::token.

Here is the call graph for this function:

◆ dcdifftimetochar()

character(string) function dcdifftimetochar ( type(dc_difftime), intent(in) diff)

DC_DIFFTIME を文字列に変換

dc_date_types#DC_DIFFTIME 型変数を文字型変数へ変換して返します. 書式は以下のようになります.

+YYYY-MM-DDThh:mm:ss.s
-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
Parameters
[in]diff変換する日時差
Returns
日時差の文字列表現

Definition at line 147 of file dcdatetimetochar.f90.

148
149 use dc_types, only: string, dp
150 use dc_string, only: tochar, cprintf, stoa
151 use dc_date_generic, only: eval
152 use dc_date_types, only: dc_difftime
153 use dc_scaledsec, only: assignment(=)
154 implicit none
155 character(STRING):: result
156 type(DC_DIFFTIME), intent(in):: diff
157
158 integer :: year, mon, day, hour, min, csec_len
159 real(DP):: sec
160 character(STRING) :: csec
161 character(1) :: pm
162continue
163
164 if ( .not. diff % nondim_flag ) then
165 call eval(diff, year=year, mon=mon, day=day, hour=hour, min=min, sec=sec)
166
167 if ( year < 0 .or. mon < 0 .or. day < 0 .or. &
168 & hour < 0 .or. min < 0 .or. sec < 0 ) then
169 year=abs(year) ; mon=abs(mon) ; day=abs(day)
170 hour=abs(hour) ; min=abs(min) ; sec=abs(sec)
171 pm = '-'
172 else
173 pm = '+'
174 end if
175
176 csec = tochar(sec)
177 if ( trim(csec) == '-0.' ) csec = '0.'
178 do while ( index('123456789.', csec(len_trim(csec):len_trim(csec)) ) == 0 )
179 if ( len_trim(csec) < 2 ) exit
180 csec = csec(1:len_trim(csec)-1)
181 end do
182 if (int(sec) > -1 .and. int(sec) < 10) then
183 if (len_trim(csec) >= len(csec)) then
184 csec = '0' // trim(csec(1:len(csec) - 1))
185 else
186 csec = '0' // trim(csec)
187 end if
188 end if
189 csec_len = len(trim(adjustl(csec)))
190 if (csec(csec_len:csec_len) == '.') csec = csec(1:csec_len-1)
191
192 result = cprintf('%c%04d-%02d-%02dT%02d:%02d:%c', &
193 & i=(/year, mon, day, hour, min/), &
194 & c1=pm, c2=trim(csec))
195 else
196 sec = diff % sec
197 result = tochar( sec )
198 end if
199
精密な時間演算のための秒スケールモジュール

References dc_types::dp, and dc_types::string.