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
Type | Intent | Optional | 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 |
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 |
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