Parsing a date on go, with that format DMYYYY, it throw me an error:
month out of range
The date is:
892009
The code is:
if t, err := time.Parse("122006","892009"); err != nil { fmt.Println(err.Error()) } else { fmt.Println(t) }
Some seven digit dates will be ambiguous (DMMYYYY or DDMYYYY?). For example,
package main
import (
"fmt"
"time"
)
func parseDate(date string) (time.Time, error) {
const pfmt = "02012006" // DDMMYYYY
if len(date) == 6 {
d := ("0" + date[0:1]) + ("0" + date[1:2]) + date[2:] // DMYYYY
t, err := time.Parse(pfmt, d)
if err == nil {
return t, nil
}
}
if len(date) == 7 {
d1 := ("0" + date[0:1]) + date[1:3] + date[3:] // DMMYYYY
t1, err1 := time.Parse(pfmt, d1)
d2 := date[0:2] + ("0" + date[2:3]) + date[3:] // DDMYYYY
t2, err2 := time.Parse(pfmt, d2)
if err1 == nil && err2 == nil {
err := &time.ParseError{
Value: date,
Message: ": ambiguous date",
}
return time.Time{}, err
}
if err1 == nil {
return t1, nil
}
if err2 == nil {
return t2, nil
}
}
return time.Parse(pfmt, date) // DDMMYYYY
}
func main() {
dates := []string{
"892009", // DMYYYY
"1102009", // DMMYYYY
"1312009", // DDMYYYY
"1122009", // ???YYYY : DMMYYYY or DDMYYYY
"31122009", // DDMMYYYY
}
for _, date := range dates {
pDate, err := parseDate(date)
fmt.Printf("%10q %v : %v
", date, pDate.Format("02-01-2006"), err)
}
}
Playground: https://play.golang.org/p/pSknyg10yJ
Output:
"892009" 08-09-2009 : <nil>
"1102009" 01-10-2009 : <nil>
"1312009" 13-01-2009 : <nil>
"1122009" 01-01-0001 : parsing time "1122009": ambiguous date
"31122009" 31-12-2009 : <nil>