web-dev-qa-db-fra.com

Analyser des chaînes de date / heure qui ne sont pas des formats «standard»

Comment analyser des chaînes de date/heure non standard dans Go. Par exemple, si je voulais convertir la chaîne 10/15/1983 En un time.Time? La fonction time.Parse() vous permet de spécifier un format.

http://play.golang.org/p/v5DbowXt1x

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("10/15/1983", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

Il en résulte une panique.

panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"

Logiquement, cela a du sens car comment est-il censé savoir quel est le jour et quel est le mois.

D'autres langues ont une fonction similaire à la suivante:

parse("mm/dd/yyyy", "10/15/1983")

Je ne trouve pas une telle fonction dans les documents Go, est-ce mon seul choix pour regex?

66
Nucleon

Il y a des valeurs clés que le temps recherche.

En changeant:

test, err := time.Parse("10/15/1983", "10/15/1983")

à

test, err := time.Parse("01/02/2006", "10/15/1983")

l'analyseur le reconnaîtra.

Voici le code modifié sur le terrain de je .

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("01/02/2006", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}


Vous pouvez utiliser la liste des constantes dans le fichier src/pkg/time/format.go pour créer vos propres formats d'analyse.

const (
    stdLongMonth      = "January"
    stdMonth          = "Jan"
    stdNumMonth       = "1"
    stdZeroMonth      = "01"
    stdLongWeekDay    = "Monday"
    stdWeekDay        = "Mon"
    stdDay            = "2"
    stdUnderDay       = "_2"
    stdZeroDay        = "02"
    stdHour           = "15"
    stdHour12         = "3"
    stdZeroHour12     = "03"
    stdMinute         = "4"
    stdZeroMinute     = "04"
    stdSecond         = "5"
    stdZeroSecond     = "05"
    stdLongYear       = "2006"
    stdYear           = "06"
    stdPM             = "PM"
    stdpm             = "pm"
    stdTZ             = "MST"
    stdISO8601TZ      = "Z0700"  // prints Z for UTC
    stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
    stdNumTZ          = "-0700"  // always numeric
    stdNumShortTZ     = "-07"    // always numeric
    stdNumColonTZ     = "-07:00" // always numeric
)

Ainsi, chaque fois que votre format spécifie une année, cela doit être fait avec "06" ou "2006", les secondes sont spécifiées par "05" ou "5" et les fuseaux horaires sont spécifiés à "MST", "Z0700", "Z07: 00 "," -0700 "," -07 "ou" -07: 00 ". Si vous référencez la liste des constantes, vous pouvez probablement créer n'importe quel format standard que vous auriez besoin d'analyser.

Par exemple, si vous souhaitez analyser la date/l'heure dans le Common Log Format , le format qu'Apache utilise pour ses fichiers journaux, vous le feriez en passant la chaîne suivante à time.Parse() comme disposition argument.

"02/Jan/2006:15:04:05 -0700"

"02" désigne le champ jour du mois, "Jan" désigne le champ nom du mois, "2006" désigne le champ année, "15" désigne le champ heure du jour au format 24 heures, "04" désigne le champ minutes, "05" désigne le champ des secondes et "-0700" désigne le champ du fuseau horaire.

Ce format analyserait l'heure PST actuelle: 31/Dec/2012:15:32:25 -0800

Ainsi, l'appel time.Parse() ressemblerait à ceci:

test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")
150
Daniel

Si vous ne vous souvenez pas des nombres dans la disposition spécifiée ("2006-01-02T15: 04: 05.000Z"), vous pouvez utiliser ma bibliothèque de formatage de date simple github.com/metakeule/fmtdate that utilise les conventions MS Excel, comme Y, M, D, h et les traduit en interne au format numérique:

package main

import (
    "github.com/metakeule/fmtdate"

    "fmt"
)

func main() {
    test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}
6
metakeule