Неисправность разбора даты на Голанге - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь проанализировать введенную пользователем строку даты в форме yyyy-mm-dd (без чего-либо другого), чтобы я мог записать ее таким же образом в файл (опять же, за ничем другим). Однако пользовательский ввод не читается правильно, и я не знаю почему. Любой намек был бы великолепен.

package main

import (
    "bufio"
    "fmt"
    "os"
    "time"
)

func main() {
    var datestring string
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Startdatum im Format yyyy-mm-dd eingeben (z.B. 2018-06-24):\n")
    datestring, _ = reader.ReadString('\n')
    fmt.Printf("Type: %T, Value: %v", datestring, datestring)

    t1, _ := time.Parse("2006-01-02", datestring)   //0001-01-01 00:00:00 +0000 UTC
    t2, _ := time.Parse("2006-01-02", "2018-05-27") //2018-05-27 00:00:00 +0000 UTC
    fmt.Printf("%v\n%v\n", t1, t2)

}

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я наконец-то придумал это решение:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "time"
)

func main() {
    // User date input
    var datestring string
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Input start date in format yyyy-mm-dd (e.g. 2018-06-24):\n")
    datestring, _ = reader.ReadString('\n')
    datestring = strings.TrimSpace(datestring)

    // Formatted date output
    t1, err := time.Parse("2006-01-02", datestring) //0001-01-01 00:00:00 +0000 UTC
    t2 := t1.Format("2006-01-02")
    if err != nil {
        panic(err)
    }
    fmt.Printf("Result: %v\n", t2)
}
0 голосов
/ 25 июня 2018

Когда вы читаете datestring, в конце появляется символ завершения строки (\n).time.Parse() считывает это как ошибку синтаксического анализа, поскольку она отсутствует в вашей строке формата, поэтому вам нужно будет обработать это.

Один из способов - удалить ее с помощью strings.TrimSpace() следующим образом:

datestring, _ = reader.ReadString('\n')
datestring = strings.TrimSpace(datestring)

Вы можете поочередно добавить \n к вашему строковому формату, но я предпочитаю обрезать перевод строки, так как он использует более стандартную строку формата времени.

t1, _ := time.Parse("2006-01-02\n", datestring)

Для отладки вам необходимообработать ошибку от time.Parse() примерно так:

t1, err := time.Parse("2006-01-02", datestring) //0001-01-01 00:00:00 +0000 UTC
if err != nil {
    panic(err)
}

Это вернет следующую ошибку, указывающую на наличие дополнительного текста в вашей строке.Обратите внимание, что закрывающая двойная кавычка " не следует сразу за датой.

panic: parsing time "2018-06-24
": extra text: 


goroutine 1 [running]:
main.main()
    /path/to/main.go:19 +0x503
exit status 2
...