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?
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")
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)
}