3
votes

Analyse flexible de la date et de l'heure dans Go

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?


1 sup>

ne m'obligeant pas à écrire essentiellement mon propre analyseur


MISE À JOUR

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()
    }
}


0 commentaires

3 Réponses :


1
votes

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.


0 commentaires


4
votes

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


0 commentaires