2015-01-24 2 views
3

Я хотел бы разобрать time.Duration. Длительность - "PT15M" (строка/байты) и хотела бы преобразовать ее в действительный time.Duration.Golang parse time.Duration


Если бы это было time.Time вещь, я хотел бы использовать:

t, err := time.Parse(time.RFC3339Nano, "2013-06-05T14:10:43.678Z")

Но это не существует (ParseDuration принимает только один параметр):

d, err := time.ParseDuration(time.RFC3339Nano, "PT15M")


Как я могу rse this ISO 8601 duration?

+2

От быстрой гугле: https://github.com/ChannelMeter/iso8601duration –

+0

Ничего из-оф -Box? –

+1

Надеюсь, это поможет: http://go-search.org/search?q=ISO+8601+duration – David

ответ

0

Это не совсем «из коробки», но регулярное выражение делает работу:

package main 

import "fmt" 
import "regexp" 
import "strconv" 
import "time" 

func main() { 
    fmt.Println(ParseDuration("PT15M")) 
    fmt.Println(ParseDuration("P12Y4MT15M")) 
} 

func ParseDuration(str string) time.Duration { 
    durationRegex := regexp.MustCompile(`P(?P<years>\d+Y)?(?P<months>\d+M)?(?P<days>\d+D)?T?(?P<hours>\d+H)?(?P<minutes>\d+M)?(?P<seconds>\d+S)?`) 
    matches := durationRegex.FindStringSubmatch(str) 

    years := ParseInt64(matches[1]) 
    months := ParseInt64(matches[2]) 
    days := ParseInt64(matches[3]) 
    hours := ParseInt64(matches[4]) 
    minutes := ParseInt64(matches[5]) 
    seconds := ParseInt64(matches[6]) 

    hour := int64(time.Hour) 
    minute := int64(time.Minute) 
    second := int64(time.Second) 
    return time.Duration(years*24*365*hour + months*30*24*hour + days*24*hour + hours*hour + minutes*minute + seconds*second) 
} 

func ParseInt64(value string) int64 { 
    if len(value) == 0 { 
     return 0 
    } 
    parsed, err := strconv.Atoi(value[:len(value)-1]) 
    if err != nil { 
     return 0 
    } 
    return int64(parsed) 
}