gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
dc_date_types.f90
Go to the documentation of this file.
1! -*- mode: f90; coding: utf-8 -*-
2!-----------------------------------------------------------------------
3! Copyright (c) 2000-2026 Gtool Development Group. All rights reserved.
4!-----------------------------------------------------------------------
5!>
6!> @author Youhei SASAKI, Yasuhiro MORIKAWA, Eizi TOYODA
7!> @copyright Copyright (C) GFD Dennou Club, 2000-2026. All rights reserved. <br/>
8!> License is BSD-2-Clause. see [COPYRIGHT](@ref COPYRIGHT) in detail
9!> @en
10!> @brief Derived types and parameters for date and time
11!> @details
12!> Derived types, variables, parameters for "dc_date" are provided.
13!> Calendar information is also managed in this module.
14!>
15!> @section date_types_types Derived types
16!>
17!> | Type | Description |
18!> |--------------|---------------------------------------------------------|
19!> | DC_DATETIME | Represents date-time as a pair of ordinal day and second |
20!> | DC_DIFFTIME | Represents time difference like "X months later" or "X days ago" |
21!>
22!> @section date_types_units Unit strings and symbols
23!>
24!> | Parameter | Description |
25!> |------------------|------------------------------------------------|
26!> | UNIT_NONDIM | Strings for nondimensional unit |
27!> | UNIT_SEC | Strings for second unit |
28!> | UNIT_MIN | Strings for minute unit |
29!> | UNIT_HOUR | Strings for hour unit |
30!> | UNIT_DAY | Strings for day unit |
31!> | UNIT_MONTH | Strings for month unit |
32!> | UNIT_YEAR | Strings for year unit |
33!> | UNIT_SYMBOL_* | Integer symbols for units |
34!>
35!> @section date_types_cal Calendar parameters
36!>
37!> | Parameter | Description |
38!> |------------------|------------------------------------------------|
39!> | CAL_CYCLIC | Cyclic calendar (30.6 days per month) |
40!> | CAL_NOLEAP | Calendar without leap years (365 days/year) |
41!> | CAL_JULIAN | Julian calendar |
42!> | CAL_GREGORIAN | Gregorian calendar |
43!>
44!> @section date_types_conv Conversion parameters
45!>
46!> | Parameter | Description |
47!> |-------------------|-----------------------------------------------|
48!> | CYCLIC_MDAYS | Days per month for cyclic calendar (30.6) |
49!> | DAY_SECONDS_EARTH | Seconds per day on Earth (86400) |
50!> | MIN_SECONDS | Seconds per minute (60) |
51!> | HOUR_SECONDS | Seconds per hour (3600) |
52!> | YEAR_MONTHS | Months per year (12) |
53!> | YEAR_DAYS | Days per year (non-leap year, 365) |
54!> | FOUR_YEARS | Days in 4 years |
55!> | FOUR_CENTURY | Days in 400 years |
56!>
57!> @enden
58!>
59!> @ja
60!> @brief 日付・時刻に関する構造データ型と定数
61!> @details
62!> dc_date で用いられる構造体や変数, 定数を提供します.
63!> 暦法に関する情報もこのモジュールで管理しています.
64!>
65!> @section date_types_types_ja 派生型一覧
66!>
67!> | 型 | 説明 |
68!> |--------------|---------------------------------------------------------|
69!> | DC_DATETIME | 通日と通秒の対で日付時刻を表現 |
70!> | DC_DIFFTIME | X ヶ月後, X 日前, などを表現 |
71!>
72!> @section date_types_units_ja 単位文字列とシンボル
73!>
74!> | パラメータ | 説明 |
75!> |------------------|------------------------------------------------|
76!> | UNIT_NONDIM | 無次元時間の単位を示す文字列 |
77!> | UNIT_SEC | 秒の単位を示す文字列 |
78!> | UNIT_MIN | 分の単位を示す文字列 |
79!> | UNIT_HOUR | 時間の単位を示す文字列 |
80!> | UNIT_DAY | 日の単位を示す文字列 |
81!> | UNIT_MONTH | 月の単位を示す文字列 |
82!> | UNIT_YEAR | 年の単位を示す文字列 |
83!> | UNIT_SYMBOL_* | 単位を示す整数シンボル |
84!>
85!> @section date_types_cal_ja 暦パラメータ
86!>
87!> | パラメータ | 説明 |
88!> |------------------|------------------------------------------------|
89!> | CAL_CYCLIC | 周期暦 (1ヶ月 30.6 日) |
90!> | CAL_NOLEAP | 閏年無しの暦 (1年 365 日) |
91!> | CAL_JULIAN | ユリウス暦 |
92!> | CAL_GREGORIAN | グレゴリオ暦 |
93!>
94!> @section date_types_conv_ja 変換パラメータ
95!>
96!> | パラメータ | 説明 |
97!> |-------------------|-----------------------------------------------|
98!> | CYCLIC_MDAYS | 周期暦での1ヶ月の日数 (30.6) |
99!> | DAY_SECONDS_EARTH | 地球の1日の秒数 (86400) |
100!> | MIN_SECONDS | 1分の秒数 (60) |
101!> | HOUR_SECONDS | 1時間の秒数 (3600) |
102!> | YEAR_MONTHS | 1年の月数 (12) |
103!> | YEAR_DAYS | 1年 (非閏年) の日数 (365) |
104!> | FOUR_YEARS | 4年の日数 |
105!> | FOUR_CENTURY | 400年の日数 |
106!>
107!> @endja
108!>
109
111
112 use dc_types, only: dp, string
113 use dc_scaledsec, only: dc_scaled_sec
114
115 implicit none
116
117 private
118 public:: dc_datetime, dc_difftime
122 public:: unit_symbol_err
126 public:: prepared_caltypes
128
129 !> @en
130 !> @name Calendar type parameters
131 !> @{
132 !> @enden
133 !> @ja
134 !> @name 暦タイプパラメータ
135 !> @{
136 !> @endja
137
138 !> @en Cyclic calendar (30.6 days per month)
139 !> @details
140 !> A calendar where each month has 30.6 days (CYCLIC_MDAYS).
141 !> (e.g., month 0: 1-30 (30.6), month 1: 1-31 (61.2),
142 !> month 2: 1-30 (91.8), month 3: 1-31 (122.4), ...)
143 !> Intended for use in experiments with virtual time.
144 !> @enden
145 !> @ja 周期暦 (1ヶ月 30.6 日)
146 !> @details
147 !> 1 ヵ月を 30.6 日 (CYCLIC_MDAYS) とする暦.
148 !> (例: 0 ヶ月目は 1 〜 30 (30.6), 1 ヶ月目は 1 〜 31 (61.2),
149 !> 2 ヶ月目は 1 〜 30 (91.8), 3 ヶ月目は 1 〜 31 (122.4), ...)
150 !> 仮想的な時間で実験を行う場合に使用することを想定しています.
151 !> @endja
152 integer, parameter:: cal_cyclic = 1
153
154 !> @en Calendar without leap years (365 days per year) @enden
155 !> @ja 閏年無しの暦 (1年 365 日) @endja
156 integer, parameter:: cal_noleap = 2
157
158 !> @en Julian calendar @enden
159 !> @ja ユリウス暦 @endja
160 integer, parameter:: cal_julian = 3
161
162 !> @en Gregorian calendar @enden
163 !> @ja グレゴリオ暦 @endja
164 integer, parameter:: cal_gregorian = 4
165
166 !> @en Array of prepared calendar types @enden
167 !> @ja 利用可能な暦タイプの配列 @endja
168 integer, parameter:: prepared_caltypes(0:3) = &
169 & (/CAL_CYCLIC, CAL_NOLEAP, CAL_JULIAN, CAL_GREGORIAN/)
170
171 !> @en Default calendar type (Gregorian) @enden
172 !> @ja デフォルトの暦タイプ (グレゴリオ暦) @endja
173 integer, save:: caltype = cal_gregorian
174
175 !> @}
176
177 !> @en
178 !> @name Time unit conversion parameters
179 !> @{
180 !> @enden
181 !> @ja
182 !> @name 時間単位変換パラメータ
183 !> @{
184 !> @endja
185
186 !> @en Days per month for cyclic calendar (also used for DC_DIFFTIME) @enden
187 !> @ja 周期暦での1ヶ月の日数 (DC_DIFFTIME の月換算にも使用) @endja
188 real(dp), parameter:: cyclic_mdays = 30.6_dp
189
190 !> @en Seconds per minute @enden
191 !> @ja 1分の秒数 @endja
192 integer, parameter:: min_seconds = 60
193
194 !> @en Seconds per hour @enden
195 !> @ja 1時間の秒数 @endja
196 integer, parameter:: hour_seconds = 3600
197
198 !> @en Seconds per day on Earth @enden
199 !> @ja 地球の1日の秒数 @endja
200 real(dp), parameter:: day_seconds_earth = 86400.0_dp
201
202 !> @en Seconds per day (variable, default is Earth day) @enden
203 !> @ja 1日の秒数 (可変, デフォルトは地球の1日) @endja
205
206 !> @en Seconds per day (DC_SCALED_SEC type) @enden
207 !> @ja 1日の秒数 (DC_SCALED_SEC 型) @endja
209
210 !> @en Flag indicating if day_seconds_scl is set @enden
211 !> @ja day_seconds_scl が設定済みかどうかのフラグ @endja
212 logical, save :: flag_set_day_seconds_scl = .false.
213
214 !> @en Days per year (non-leap year) @enden
215 !> @ja 1年 (非閏年) の日数 @endja
216 integer, parameter:: year_days = 365
217
218 !> @en Months per year @enden
219 !> @ja 1年の月数 @endja
220 integer, parameter:: year_months = 12
221
222 !> @en Days in 4 years (including leap year) @enden
223 !> @ja 4年の日数 (閏年を含む) @endja
224 integer, parameter:: four_years = year_days * 4 + 1
225
226 !> @en Days in 400 years @enden
227 !> @ja 400年の日数 @endja
228 integer, parameter:: four_century = year_days * 400 + 97
229
230 !> @}
231
232 !> @en
233 !> @name Unit string parameters
234 !> @{
235 !> @enden
236 !> @ja
237 !> @name 単位文字列パラメータ
238 !> @{
239 !> @endja
240
241 !> @en Strings recognized as nondimensional unit @enden
242 !> @ja 無次元時間の単位を示す文字列 @endja
243 character(*), parameter, dimension(1) :: unit_nondim = (/ &
244 & '1' /)
245
246 !> @en Strings recognized as second unit @enden
247 !> @ja 秒の単位を示す文字列 @endja
248 character(*), parameter, dimension(8) :: unit_sec = (/ &
249 & 'seconds', 'second ', 'secs. ', 'secs ', &
250 & 'sec. ', 'sec ', 's. ', 's '/)
251
252 !> @en Strings recognized as minute unit @enden
253 !> @ja 分の単位を示す文字列 @endja
254 character(*), parameter, dimension(4) :: unit_min = (/ &
255 & 'minutes', 'minute ', 'min. ', 'min '/)
256
257 !> @en Strings recognized as hour unit @enden
258 !> @ja 時間の単位を示す文字列 @endja
259 character(*), parameter, dimension(8) :: unit_hour = (/ &
260 & 'hours', 'hour ', 'hrs. ', 'hrs ', &
261 & 'hr. ', 'hr ', 'h. ', 'h '/)
262
263 !> @en Strings recognized as day unit @enden
264 !> @ja 日の単位を示す文字列 @endja
265 character(*), parameter, dimension(4) :: unit_day = (/ &
266 & 'days', 'day ', 'd. ', 'd '/)
267
268 !> @en Strings recognized as month unit @enden
269 !> @ja 月の単位を示す文字列 @endja
270 character(*), parameter, dimension(6) :: unit_month = (/ &
271 & 'months', 'month ', 'mon. ', &
272 & 'mon ', 'mo. ', 'mo '/)
273
274 !> @en Strings recognized as year unit @enden
275 !> @ja 年の単位を示す文字列 @endja
276 character(*), parameter, dimension(4) :: unit_year = (/ &
277 & 'years', 'year ', 'yr. ', 'yr '/)
278
279 !> @}
280
281 !> @en
282 !> @name Unit symbol parameters
283 !> @{
284 !> @enden
285 !> @ja
286 !> @name 単位シンボルパラメータ
287 !> @{
288 !> @endja
289
290 !> @en Symbol for invalid unit @enden
291 !> @ja 無効な単位を示すシンボル @endja
292 integer, parameter:: unit_symbol_err = -1
293
294 !> @en Symbol for nondimensional unit @enden
295 !> @ja 無次元時間の単位を示すシンボル @endja
296 integer, parameter:: unit_symbol_nondim = 1
297
298 !> @en Symbol for second unit @enden
299 !> @ja 秒の単位を示すシンボル @endja
300 integer, parameter:: unit_symbol_sec = 2
301
302 !> @en Symbol for minute unit @enden
303 !> @ja 分の単位を示すシンボル @endja
304 integer, parameter:: unit_symbol_min = 3
305
306 !> @en Symbol for hour unit @enden
307 !> @ja 時間の単位を示すシンボル @endja
308 integer, parameter:: unit_symbol_hour = 4
309
310 !> @en Symbol for day unit @enden
311 !> @ja 日の単位を示すシンボル @endja
312 integer, parameter:: unit_symbol_day = 5
313
314 !> @en Symbol for month unit @enden
315 !> @ja 月の単位を示すシンボル @endja
316 integer, parameter:: unit_symbol_month = 6
317
318 !> @en Symbol for year unit @enden
319 !> @ja 年の単位を示すシンボル @endja
320 integer, parameter:: unit_symbol_year = 7
321
322 !> @}
323
324 !> @en
325 !> @brief Derived type for date-time
326 !> @details
327 !> Represents date-time as a pair of ordinal day and ordinal second.
328 !>
329 !> When using variables of this derived type, always initialize them
330 !> using dc_date#Create or dc_date#assignment(=).
331 !> Do not modify internal variables such as *day* or *sec* directly.
332 !>
333 !> See "List" and "Usage" sections in dc_date for usage details.
334 !> @enden
335 !>
336 !> @ja
337 !> @brief 日付時刻を表現する派生型
338 !> @details
339 !> 通日と通秒の対で日付時刻を表現します.
340 !>
341 !> この構造データ型の変数を使用する際は必ず変数を
342 !> dc_date#Create または dc_date#assignment(=)
343 !> によって初期化してください. また, *day*, *sec* などの内部変数は
344 !> 直接変更しないでください.
345 !>
346 !> 利用法は dc_date の "List" および "Usage" を参照してください.
347 !> @endja
349 sequence
350 integer :: caltype = cal_gregorian !< @en Calendar type @enden @ja 暦法 @endja
351 type(dc_scaled_sec):: day !< @en Day @enden @ja 日 @endja
352 type(dc_scaled_sec):: sec !< @en Seconds @enden @ja 秒 @endja
353 logical:: dummy = .false. !< @en Dummy for alignment @enden @ja 境界調整用ダミー @endja
354 type(dc_scaled_sec):: day_seconds !< @en Seconds per day @enden @ja 1日の秒数 @endja
355 character(STRING) :: zone = '+00:00' !< @en Time zone (offset from UTC) @enden @ja UTCからの時差 @endja
356 end type dc_datetime
357
358 !> @en
359 !> @brief Derived type for time difference
360 !> @details
361 !> A data type for expressing time differences like "X months later"
362 !> or "X days ago".
363 !>
364 !> When using variables of this derived type, always initialize them
365 !> using dc_date#Create or dc_date#assignment(=).
366 !> Do not modify internal variables such as *day* or *sec* directly.
367 !>
368 !> See "List" and "Usage" sections in dc_date for usage details.
369 !>
370 !> Note: One month is converted using dc_date_types#CYCLIC_MDAYS.
371 !> @enden
372 !>
373 !> @ja
374 !> @brief 時間差を表現する派生型
375 !> @details
376 !> X ヶ月後, X 日前, などを表現するためのデータ型です.
377 !>
378 !> この構造データ型の変数を使用する際は必ず変数を
379 !> dc_date#Create または dc_date#assignment(=)
380 !> によって初期化してください. また, *day*, *sec* などの内部変数は
381 !> 直接変更しないでください.
382 !>
383 !> 利用法は dc_date の "List" および "Usage" を参照してください.
384 !>
385 !> なお, 1 ヶ月は dc_date_types#CYCLIC_MDAYS と換算します.
386 !> @endja
388 sequence
389 type(dc_scaled_sec):: mon !< @en Month @enden @ja 月 @endja
390 type(dc_scaled_sec):: day !< @en Day @enden @ja 日 @endja
391 type(dc_scaled_sec):: sec !< @en Seconds or nondimensional time @enden @ja 秒または無次元時間 @endja
392 logical:: dummy0 = .false. !< @en Dummy for alignment @enden @ja 境界調整用ダミー @endja
393 type(dc_scaled_sec):: day_seconds !< @en Seconds per day @enden @ja 1日の秒数 @endja
394 logical:: nondim_flag = .false. !< @en Flag for nondimensional number @enden @ja 無次元数フラグ @endja
395 logical:: dummy1 = .false. !< @en Dummy for alignment @enden @ja 境界調整用ダミー @endja
396 end type dc_difftime
397
398 !> @namespace dc_date_types
399end module dc_date_types
日付・時刻に関する構造データ型と定数
character(*), dimension(6), parameter, public unit_month
月の単位を示す文字列
integer, parameter, public unit_symbol_err
無効な単位を示すシンボル
integer, parameter, public unit_symbol_hour
時間の単位を示すシンボル
integer, parameter, public unit_symbol_min
分の単位を示すシンボル
integer, parameter, public cal_noleap
閏年無しの暦 (1年 365 日)
real(dp), parameter, public cyclic_mdays
周期暦での1ヶ月の日数 (DC_DIFFTIME の月換算にも使用)
integer, parameter, public hour_seconds
1時間の秒数
integer, parameter, public unit_symbol_month
月の単位を示すシンボル
character(*), dimension(1), parameter, public unit_nondim
無次元時間の単位を示す文字列
integer, parameter, public four_years
4年の日数 (閏年を含む)
integer, parameter, public cal_cyclic
周期暦 (1ヶ月 30.6 日)
real(dp), save, public day_seconds
1日の秒数 (可変, デフォルトは地球の1日)
integer, save, public caltype
デフォルトの暦タイプ (グレゴリオ暦)
integer, parameter, public unit_symbol_sec
秒の単位を示すシンボル
integer, parameter, public unit_symbol_nondim
無次元時間の単位を示すシンボル
type(dc_scaled_sec), save, public day_seconds_scl
1日の秒数 (DC_SCALED_SEC 型)
character(*), dimension(4), parameter, public unit_day
日の単位を示す文字列
logical, save, public flag_set_day_seconds_scl
day_seconds_scl が設定済みかどうかのフラグ
integer, parameter, public year_days
1年 (非閏年) の日数
integer, parameter, public year_months
1年の月数
integer, parameter, public cal_gregorian
グレゴリオ暦
integer, parameter, public four_century
400年の日数
integer, dimension(0:3), parameter, public prepared_caltypes
利用可能な暦タイプの配列
integer, parameter, public min_seconds
1分の秒数
character(*), dimension(8), parameter, public unit_sec
秒の単位を示す文字列
character(*), dimension(8), parameter, public unit_hour
時間の単位を示す文字列
real(dp), parameter, public day_seconds_earth
地球の1日の秒数
integer, parameter, public unit_symbol_day
日の単位を示すシンボル
character(*), dimension(4), parameter, public unit_year
年の単位を示す文字列
integer, parameter, public unit_symbol_year
年の単位を示すシンボル
character(*), dimension(4), parameter, public unit_min
分の単位を示す文字列
integer, parameter, public cal_julian
ユリウス暦
精密な時間演算のための秒スケールモジュール
種別型パラメタを提供します。
Definition dc_types.f90:55
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition dc_types.f90:137
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:92