Suite à cette question , je souhaite analyser une date / heure passée sur la commande ligne vers un programme Go. Pour le moment, j'utilise le package flag pour remplir une variable de chaîne ts puis le code suivant:
package main
import (
"fmt"
"time"
)
func main() {
const layout = "2006-01-02T15:04:05"
var l string
var input string
for _, input = range []string{"2019-05-30", "2019-05-30T16", "2019-05-30T16:04", "2019-05-30T16:04:34",
"This won't work", "This is extravagantly long and won't work either"} {
if len(input) < len(layout) {
l = layout[:len(input)]
} else {
l = layout
}
if d, err := time.Parse(l, input); err != nil {
fmt.Printf("Error %s\n", err.Error())
} else {
fmt.Printf("Layout %-20s gives time %v\n", l, d)
}
}
}
Cela fonctionne bien, à condition que l'utilisateur passe exactement le bon format - par exemple 2019-05-20T09: 07: 33 ou quelque chose du genre.
Cependant, ce que je voudrais, si possible, c'est la flexibilité de passer par exemple 2019-05-20T09: 07 ou 2019-05-20T09 ou peut-être même 2019-05-20 et avoir les heures, les minutes et les secondes le cas échéant, la valeur par défaut est 0.
Y a-t-il une manière 1 sensée de procéder?
ne m'obligeant pas à écrire essentiellement mon propre analyseur
J'ai en quelque sorte une solution à ce problème, bien qu'il ne soit pas particulièrement élégant, il semble fonctionner dans la plupart des cas que je suis susceptible de rencontrer.
if ts == "" {
config.Until = time.Now()
} else {
const layout = "2006-01-02T15:04:05"
if config.Until, err = time.Parse(layout, ts); err != nil {
log.Errorf("Could not parse %s as a time string: %s. Using current date/time instead.", ts, err.Error())
config.Until = time.Now()
}
}
3 Réponses :
Dans le scénario spécifique que vous décrivez, vous pouvez vérifier la longueur de la chaîne d'horodatage d'entrée et ajouter la longueur appropriée de zéro élément à la fin pour correspondre à votre mise en page . Donc, fondamentalement, vous pouvez ajouter autant de la chaîne "T00: 00: 00" (en comptant à partir de la fin), à l'entrée qu'il en manque dans la longueur par rapport à la mise en page chaîne de format.
Je pense que cette bibliothèque est ce que vous recherchez https://github.com/araddon/dateparse a> Analyser de nombreuses chaînes de date sans connaître le format à l'avance. Utilise un scanner pour lire les octets et utiliser une machine à états pour trouver le format.
t, err := dateparse.ParseAny("3/1/2014")
Essayez simplement chaque format, jusqu'à ce qu'il fonctionne. Si aucun ne fonctionne, renvoyez une erreur.
var formats = []string{"2006-01-02T15:04:05", "2006-01-02", ...}
func parseTime(input string) (time.Time, error) {
for _, format := range formats {
t, err := time.Parse(format, input)
if err == nil {
return t, nil
}
}
return time.Time{}, errors.New("Unrecognized time format")
}