Here is a code that processes fractional units of time such as PT3.001S .
var durationRegex = regexp.MustCompile('P([\d\.]+Y)?([\d\.]+M)?([\d\.]+D)?T?([\d\.]+H)?([\d\.]+M)?([\d\.]+?S)?') // ParseDuration converts a ISO8601 duration into a time.Duration func ParseDuration(str string) time.Duration { matches := durationRegex.FindStringSubmatch(str) years := parseDurationPart(matches[1], time.Hour*24*365) months := parseDurationPart(matches[2], time.Hour*24*30) days := parseDurationPart(matches[3], time.Hour*24) hours := parseDurationPart(matches[4], time.Hour) minutes := parseDurationPart(matches[5], time.Second*60) seconds := parseDurationPart(matches[6], time.Second) return time.Duration(years + months + days + hours + minutes + seconds) } func parseDurationPart(value string, unit time.Duration) time.Duration { if len(value) != 0 { if parsed, err := strconv.ParseFloat(value[:len(value)-1], 64); err == nil { return time.Duration(float64(unit) * parsed) } } return 0 }
source share