70 use,
intrinsic :: iso_fortran_env, only: i1 => int8, i2 => int16
71 implicit none;
private
146 integer(i2),
public :: year
147 integer(i1),
public :: month
148 integer(i1),
public :: day
149 integer(i1),
public :: hour
150 integer(i1),
public :: minute
151 integer(i1),
public :: second
152 integer(i2),
public :: millisecond
154 procedure, pass(this),
public :: to_string => datetime_to_string
155 procedure, pass(this),
public :: parse => datetime_parse
163 module procedure :: datetime_new, datetime_new_from_string
170 elemental function datetime_new(year, month, day, hour, minute, second, millisecond)
result(that)
171 integer,
intent(in),
optional :: year
172 integer,
intent(in),
optional :: month
173 integer,
intent(in),
optional :: day
174 integer,
intent(in),
optional :: hour
175 integer,
intent(in),
optional :: minute
176 integer,
intent(in),
optional :: second
177 integer,
intent(in),
optional :: millisecond
180 that%year = 0_i2;
if (
present(year)) that%year = int(year, kind=i2)
181 that%month = 0_i1;
if (
present(month)) that%month = int(month, kind=i1)
182 that%day = 0_i1;
if (
present(day)) that%day = int(day, kind=i1)
183 that%hour = 0_i1;
if (
present(hour)) that%hour = int(hour, kind=i1)
184 that%minute = 0_i1;
if (
present(minute)) that%minute = int(minute, kind=i1)
185 that%second = 0_i1;
if (
present(second)) that%second = int(second, kind=i1)
186 that%millisecond = 0_i2;
if (
present(millisecond)) that%millisecond = int(millisecond, kind=i2)
189 elemental function datetime_new_from_string(string, fmt)
result(that)
190 character(*),
intent(in) :: string
191 character(*),
intent(in),
optional :: fmt
194 if (
present(fmt))
then
195 call that%parse(string, fmt)
197 call that%parse(string)
207 function now()
result(res)
212 call date_and_time(values=values)
214 res%year = int(values(1), kind=i2)
215 res%month = int(values(2), kind=i1)
216 res%day = int(values(3), kind=i1)
217 res%hour = int(values(5), kind=i1)
218 res%minute = int(values(6), kind=i1)
219 res%second = int(values(7), kind=i1)
220 res%millisecond = int(values(8), kind=i2)
234 pure elemental integer function weekday(this)
237 integer :: year, month, j, k
250 weekday = mod(this%day + ((month + 1) * 26) / 10 + k + k / 4 + j / 4 + 5 * j, 7) - 1
252 if (weekday < 0) weekday = 6
284 elemental subroutine datetime_parse(this, string, fmt)
285 class(
datetime),
intent(inout) :: this
286 character(*),
intent(in) :: string
287 character(*),
intent(in),
optional :: fmt
291 character(256) :: errmsg
292 character(len(string)) :: tmp
293 character(:),
allocatable :: dftfmt
295 if (
present(fmt))
then
298 if (len_trim(string) == 10)
then
299 dftfmt =
'yyyy-MM-dd'
301 dftfmt =
'yyyy-MM-dd HH:mm:ss'
307 this%year = 0_i2; this%month = 0_i1; this%day = 0_i1
308 this%hour = 0_i1; this%minute = 0_i1; this%second = 0_i1; this%millisecond = 0_i2
312 select case (tmp(:3))
313 case (
'Jan'); tmp(:3) =
' 01'
314 case (
'Feb'); tmp(:3) =
' 02'
315 case (
'Mar'); tmp(:3) =
' 03'
316 case (
'Apr'); tmp(:3) =
' 04'
317 case (
'May'); tmp(:3) =
' 05'
318 case (
'Jun'); tmp(:3) =
' 06'
319 case (
'Jul'); tmp(:3) =
' 07'
320 case (
'Aug'); tmp(:3) =
' 08'
321 case (
'Sep'); tmp(:3) =
' 09'
322 case (
'Oct'); tmp(:3) =
' 10'
323 case (
'Nov'); tmp(:3) =
' 11'
324 case (
'Dec'); tmp(:3) =
' 12'
326 read(tmp(2:),
'(i2.2,1x,i2.2,1x,i4.4)', iostat=ierr, iomsg=errmsg) &
330 case (
'MMM-dd-yyyy HH:mm:ss',
'MMM-dd-yyyyTHH:mm:ss')
331 select case (tmp(:3))
332 case (
'Jan'); tmp(:3) =
' 01'
333 case (
'Feb'); tmp(:3) =
' 02'
334 case (
'Mar'); tmp(:3) =
' 03'
335 case (
'Apr'); tmp(:3) =
' 04'
336 case (
'May'); tmp(:3) =
' 05'
337 case (
'Jun'); tmp(:3) =
' 06'
338 case (
'Jul'); tmp(:3) =
' 07'
339 case (
'Aug'); tmp(:3) =
' 08'
340 case (
'Sep'); tmp(:3) =
' 09'
341 case (
'Oct'); tmp(:3) =
' 10'
342 case (
'Nov'); tmp(:3) =
' 11'
343 case (
'Dec'); tmp(:3) =
' 12'
345 read(tmp(2:),
'(i2.2,1x,i2.2,1x,i4.4,1x,i2.2,2(1x,i2.2))', iostat=ierr, iomsg=errmsg) &
353 read(tmp,
'(i4.4,1x,i2.2)', iostat=ierr, iomsg=errmsg) &
357 read(tmp,
'(i4.4,2(1x,i2.2))', iostat=ierr, iomsg=errmsg) &
362 read(tmp,
'(i2.2,1x,i2.2,1x, i4.4)', iostat=ierr, iomsg=errmsg) &
367 read(tmp,
'(i2.2,1x,i2.2,1x,i4.4)', iostat=ierr, iomsg=errmsg) &
371 case (
'yyyy-MM-ddTHH:mm:ss',
'yyyy-MM-dd HH:mm:ss')
372 read(tmp,
'(i4.4,2(1x,i2.2),1x,i2.2,2(1x,i2.2))', iostat=ierr, iomsg=errmsg) &
380 read(tmp,
'(i2.2,2(1x,i2.2))', iostat=ierr, iomsg=errmsg) &
387 this%year = 1970_i2; this%month = 1_i1; this%day = 1_i1
388 this%hour = 0_i1; this%minute = 0_i1; this%second = 0_i1; this%millisecond = 0_i2
397 function datetime_to_string(this, fmt)
result(res)
399 character(*),
intent(in),
optional :: fmt
400 character(:),
allocatable :: res
402 character :: sep, dash
403 character(:),
allocatable :: dftfmt, tmp, tmp2
405 character(256) :: errmsg
407 if (
present(fmt))
then
410 dftfmt =
'yyyy-MM-ddTHH:mm:ss'
413 sep = merge(
'T',
' ', index(dftfmt,
'T') > 0)
414 dash = merge(
'-',
' ', index(dftfmt,
'-') > 0)
416 allocate(
character(25) :: res)
419 select case (this%month)
420 case (1); tmp =
'Jan'
421 case (2); tmp =
'Feb'
422 case (3); tmp =
'Mar'
423 case (4); tmp =
'Apr'
424 case (5); tmp =
'May'
425 case (6); tmp =
'Jun'
426 case (7); tmp =
'Jul'
427 case (8); tmp =
'Aug'
428 case (9); tmp =
'Sep'
429 case (10); tmp =
'Oct'
430 case (11); tmp =
'Nov'
431 case (12); tmp =
'Dec'
433 select case (weekday(this))
434 case (0); tmp2 =
'Sun'
435 case (1); tmp2 =
'Mon'
436 case (2); tmp2 =
'Tue'
437 case (3); tmp2 =
'Wed'
438 case (4); tmp2 =
'Thu'
439 case (5); tmp2 =
'Fri'
440 case (6); tmp2 =
'Sat'
444 case (
'MMM-dd-yyyy',
'MMM dd yyyy')
445 write(res,
'(a3,a1,i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
451 case (
'MMM-ddd-yyyy',
'MMM ddd yyyy')
452 write(res,
'(a3,a1,a3," ",i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
459 case (
'MMM-dd-yyyy HH:mm:ss',
'MMM-dd-yyyyTHH:mm:ss',
'MMM dd yyyy HH:mm:ss',
'MMM dd yyyyTHH:mm:ss')
460 write(res,
'(a3,a1,i2.2,a1,i4.4,a1,i2.2,2(":",i2.2))', iostat=ierr, iomsg=errmsg) &
469 case (
'MMM-ddd-yyyy HH:mm:ss',
'MMM-ddd-yyyyTHH:mm:ss',
'MMM ddd yyyy HH:mm:ss',
'MMM ddd yyyyTHH:mm:ss')
470 write(res,
'(a3,a1,a3," ",i2.2,a1,i4.4,a1,i2.2,2(":",i2.2))', iostat=ierr, iomsg=errmsg) &
480 case (
'yyyy-MM',
'yyyy MM')
481 write(res,
'(i4.4,a1,i2.2)', iostat=ierr, iomsg=errmsg) &
485 case (
'yyyy-MM-dd',
'yyyy MM dd')
486 write(res,
'(i4.4,2(a1,i2.2))', iostat=ierr, iomsg=errmsg) &
492 case (
'yyyy-MM-ddd',
'yyyy MM ddd')
493 write(res,
'(i4.4,a1,i2.2,a1,a3," ",i2.2)', iostat=ierr, iomsg=errmsg) &
500 case (
'dd-MM-yyyy',
'dd MM yyyy')
501 write(res,
'(i2.2,a1,i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
507 case (
'ddd-MM-yyyy',
'ddd MM yyyy')
508 write(res,
'(a3,a1,i2.2," ",i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
515 case (
'MM-dd-yyyy',
'MM dd yyyy')
516 write(res,
'(i2.2,a1,i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
522 case (
'MM-ddd-yyyy',
'MM ddd yyyy')
523 write(res,
'(i2.2,a1,a3," ",i2.2,a1,i4.4)', iostat=ierr, iomsg=errmsg) &
530 case (
'yyyy-MM-ddTHH:mm:ss',
'yyyy-MM-dd HH:mm:ss',
'yyyy MM ddTHH:mm:ss',
'yyyy MM dd HH:mm:ss')
531 write(res,
'(i4.4,2(a1,i2.2),a1,i2.2,2(":",i2.2))', iostat=ierr, iomsg=errmsg) &
541 case (
'yyyy-MM-dddTHH:mm:ss',
'yyyy-MM-ddd HH:mm:ss',
'yyyy MM dddTHH:mm:ss',
'yyyy MM ddd HH:mm:ss')
542 write(res,
'(i4.4,a1,i2.2,a1,a3," ",i2.2,a1,i2.2,2(":",i2.2))', iostat=ierr, iomsg=errmsg) &
554 write(res,
'(i2.2,2(":",i2.2))', iostat=ierr, iomsg=errmsg) &
Compact representation of date and time Stores all components in minimal integer kinds to reduce memo...