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
  • 1900-01-01

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

format_string = "(I2.2)"

IF (nargs > 3) THEN

    !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), '-')

    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
    
ELSE !format is YYYY-MM-DD
    hour = 0
    minute = 0
    second = 0
    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