ScanTimeStringAsString Subroutine

private subroutine ScanTimeStringAsString(string, YYYY, MM, DD, hh, min, ss, tz)

scan a string to extract time information as character strings: year, month, day, hour, minute, second, timezone supported formats:

  • 1900-01-01T01:00:00+00:00
  • 1900-1-1 01:00:00
  • 1900-1-1 1:0:0

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: string
character(len=*), intent(out) :: YYYY

year

character(len=*), intent(out) :: MM

month

character(len=*), intent(out) :: DD

day

character(len=*), intent(out) :: hh

hour

character(len=*), intent(out) :: min

minute

character(len=*), intent(out) :: ss

second

character(len=*), intent(out) :: tz

time zone


Variables

Type Visibility Attributes Name Initial
character(len=100), public, POINTER :: args(:)
integer(kind=short), public :: day
character(len=1024), public :: format_string
integer(kind=short), public :: hour
integer(kind=short), public :: i
integer(kind=short), public :: iminus
integer(kind=short), public :: iplus
integer(kind=short), public :: minute
integer(kind=short), public :: month
integer(kind=short), public :: nargs
integer(kind=short), public :: second
character(len=20), public :: time
character(len=2), public :: tzhh

time zone hour

integer(kind=short), public :: tzhour
character(len=2), public :: tzmin

time zone minute

integer(kind=short), public :: tzminute
character(len=20), public :: tzstring
integer(kind=short), public :: year

Source Code

SUBROUTINE ScanTimeStringAsString &
!
(string, YYYY, MM, DD, hh, min, ss, tz ) 

USE StringManipulation, ONLY: &
!Imported routines:
StringTokenize, StringCompact, &
StringToShort, ToString

IMPLICIT NONE

!Arguments with intent(in):
CHARACTER (LEN = *), INTENT (IN) :: string
CHARACTER (LEN = *), INTENT (OUT) :: YYYY !! year
CHARACTER (LEN = *), INTENT (OUT) :: MM !! month
CHARACTER (LEN = *), INTENT (OUT) :: DD !! day
CHARACTER (LEN = *), INTENT (OUT) :: hh !! hour
CHARACTER (LEN = *), INTENT (OUT) :: min !! minute
CHARACTER (LEN = *), INTENT (OUT) :: ss !! second
CHARACTER (LEN = *), INTENT (OUT) :: tz !!time zone




!Local declarations:
CHARACTER (LEN = 2) :: tzhh !! time zone hour
CHARACTER (LEN = 2) :: tzmin !! time zone minute
INTEGER (KIND = short) :: i, iplus, iminus
INTEGER (KIND = short) :: year, month, day, hour, minute, second, tzhour, tzminute
CHARACTER (len=100), POINTER :: args (:)
CHARACTER (LEN = 20) :: time, tzstring
INTEGER (KIND = short) :: nargs
character(len=1024) :: format_string

!------------end of declaration------------------------------------------------

!search for year, month, and day

CALL StringTokenize (string = string, delims = '-', args = args, nargs = nargs)

year = StringToShort ( StringCompact (args (1)) )

month = StringToShort ( StringCompact (args (2)) )


!search for 'T' after day
i = INDEX (args (3), 'T', BACK = .TRUE.)

IF (i > 0) THEN
    day = StringToShort (  args (3) (1 : i-1) )
ELSE
   day = StringToShort ( StringCompact (args (3)) )
END IF

!search for time: hour, minute, second

!check wether T is present

IF ( INDEX (string, 'T') > 0) THEN
    
    i = INDEX (string, 'T')
    
ELSE IF  ( INDEX (string, ' ') > 0) THEN  
    
    i = INDEX (string, ' ')

END IF

time = string ( i+1 : len_trim (string) )

CALL StringTokenize (string = time, delims = ':', args = args, nargs = nargs)

hour = StringToShort ( StringCompact (args (1)) )

minute = StringToShort ( StringCompact (args (2)) )

iplus = INDEX (args(3), '+')

iminus = INDEX (args(3), '-')

format_string = "(I2.2)"

IF ( iplus > 0) THEN
    second = StringToShort ( StringCompact (args (3) (1 : iplus - 1) ) )
    
    CALL StringTokenize (string = time, delims = '+', args = args, nargs = nargs)
    tzstring =  args (2) 
    CALL StringTokenize (string = tzstring, delims = ':', args = args, nargs = nargs)
    tzhour = StringToShort ( StringCompact (args (1)) )
    tzminute = StringToShort ( StringCompact (args (2)) )
    tzhh = ToString (tzhour, format_string)
    tzmin = ToString (tzminute, format_string)
    tz = '+' // tzhh // ':' // tzmin
    
ELSE IF (iminus > 0 ) THEN
    second = StringToShort ( StringCompact (args (3) (1 : iminus - 1) ) )
    
    CALL StringTokenize (string = time, delims = '-', args = args, nargs = nargs)
    tzstring =  args (2) 
    CALL StringTokenize (string = tzstring, delims = ':', args = args, nargs = nargs)
    tzhour = StringToShort ( StringCompact (args (1)) )
    tzminute = StringToShort ( StringCompact (args (2)) )
    tzhh = ToString (tzhour, format_string)
    tzmin = ToString (tzminute, format_string)
    tz = '-' // tzhh // ':' // tzmin
    
ELSE
    second = StringToShort ( StringCompact (args (3) ) )
    !time zone is not given, set to default
    tzhh = '00'
    tzmin = '00'
    tz = '+' // tzhh // ':' // tzmin
END IF

!convert short integer to string
YYYY = ToString (year)

MM = ToString (month, format_string)

DD = ToString (day, format_string)

hh = ToString (hour, format_string)

min = ToString (minute, format_string)

ss = ToString (second, format_string)


RETURN
END SUBROUTINE ScanTimeStringAsString