Help with ISO8601 duration string conversion

I am trying to convert a series of string tags displaying durations in the ISO8601 format to DateTime tags or Integer tags. I considered using an expression tag, but our expression was unsuccessful (see example below). This expression returns "null Days, null Hours and null Minutes." I am less concerned with the actual date, I am only needing the days, hours, and minutes. Does anyone have any advice or possible solutions?

concat(
    (substring({[~]AStringTag.value},1,(indexOf({[~]AStringTag.value},"D"))))
    , " Days, "
    , (substring({[~]AStringTag.value},(indexOf({[~]AStringTag.value},"T")+1)
        ,(indexOf({[~]AStringTag.value},"H"))))
    , " Hours and "
    , (substring({[~]AStringTag.value},(indexOf({[~]AStringTag.value},"H")+1)
        ,(indexOf({[~]AStringTag.value},"M"))))
    , " Minutes"
    )

Give us a sample of the string you are feeding into the expression, if you can, please.

1 Like

My string value looks like "P6DT2H14M"

It works for me if I create the tag and use the [default] tag path (which is where my tag is located).

concat(
    (substring({[default]AStringTag.value},1,(indexOf({[default]AStringTag.value},"D"))))
    , " Days, "
    , (substring({[default]AStringTag.value},(indexOf({[default]AStringTag.value},"T")+1)
        ,(indexOf({[default]AStringTag.value},"H"))))
    , " Hours and "
    , (substring({[default]AStringTag.value},(indexOf({[default]AStringTag.value},"H")+1)
        ,(indexOf({[default]AStringTag.value},"M"))))
    , " Minutes"
)

Input: P6DT2H14M
Output: 6 Days, 2 Hours and 14 Minutes.

I got it working! Thanks!