Golang日期解析故障

时间:2018-06-25 03:39:23

标签: date parsing go

我正在尝试以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 :(得分:1)

当您阅读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

答案 1 :(得分:0)

我终于想出了这个解决方案:

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