Date 戈朗日期解析故障
我试图解析一个用户输入的日期字符串,格式为yyyy mm dd(后面没有其他内容),这样我就可以以同样的方式将其写入文件(同样,后面没有其他内容)。 然而,用户输入没有正确读取,我不知道为什么。任何暗示都很好Date 戈朗日期解析故障,date,parsing,go,Date,Parsing,Go,我试图解析一个用户输入的日期字符串,格式为yyyy mm dd(后面没有其他内容),这样我就可以以同样的方式将其写入文件(同样,后面没有其他内容)。 然而,用户输入没有正确读取,我不知道为什么。任何暗示都很好 package main import ( "bufio" "fmt" "os" "time" ) func main() { var datestring string reader := bufio.NewReader(os.Stdi
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)
}
当您读取日期字符串时,它的结尾有一个换行符(
\n
)终止字符time.Parse()
将此读取为解析错误,因为它不是您的格式字符串,所以您需要处理此错误
一种方法是使用字符串将其剥离。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
我终于想出了这个解决方案:
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)
}
一次.Parse返回一个time.time类型的对象,其String()接口{}是预定义的,用于以非常特定的方式打印时间值。如果希望它以接收时间的方式再次打印时间,则必须重新格式化自己。例如,fmt.Println(t1.format(“2006-01-02”))
Never,字面上说,Never,Never,Never,Never,Never,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,EveryReadString一直读取,直到输入中第一次出现delim,返回一个包含数据的字符串,直到并包括分隔符。