如何在Go中使用time.Parse支持两种日期格式解析避免分隔符报错
问题修复方案
现有代码核心问题
- 日期解析逻辑错误:现有分支判断逻辑完全失效,两种格式的解析结果未做正确校验,解析失败得到的零值
time.Time会导致后续逻辑异常 - 闰年判断逻辑错误:误用
Day()方法(返回当月第几天,取值范围1~31)做闰年计算,闰年判断需要使用Year()方法获取年份计算 - JSON字段映射错误:结构体
User的jsontag写为小写fname/lname,但JSON文件中对应的key是大写开头的Fname/Lname,会导致姓名字段解析为空
修复后完整代码
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "os" "time" ) // Users struct which contains // an array of users type Users struct { Users []User `json:"users"` } // User struct which contains a name // a type and a list of social links type User struct { Firstname string `json:"Fname"` // 修正tag和JSON字段对应 Secondname string `json:"Lname"` // 修正tag和JSON字段对应 Date string `json:"date"` } // 通用日期解析函数,支持两种格式 func parseDate(dateStr string) (time.Time, error) { // 先尝试解析斜杠格式 date, err := time.Parse("2006/01/02", dateStr) if err == nil { return date, nil } // 失败再尝试解析横杠格式 date, err = time.Parse("2006-01-02", dateStr) if err == nil { return date, nil } // 都失败返回错误 return time.Time{}, err } // 闰年判断工具函数 func isLeapYear(year int) bool { return year%400 == 0 || (year%4 == 0 && year%100 != 0) } func Birthday() { jsonFile, err := os.Open("users.json") if err != nil { log.Fatal(err) } fmt.Println("Successfully Opened users.json") defer jsonFile.Close() byteValue, err := ioutil.ReadAll(jsonFile) if err != nil { log.Fatal(err) } var users Users err = json.Unmarshal(byteValue, &users) if err != nil { log.Fatal(err) } for i := 0; i < len(users.Users); i++ { user := users.Users[i] date, err := parseDate(user.Date) if err != nil { log.Printf("解析用户%s %s的日期%s失败: %v", user.Firstname, user.Secondname, user.Date, err) continue } fmt.Println("User First Name: " + user.Firstname) fmt.Println("User Second Name: " + user.Secondname) fmt.Println("User Date: " + user.Date) if isLeapYear(date.Year()) { fmt.Println(user.Date, " is a Leap Year ✨✨✨ ") } else { fmt.Println(user.Date, " is Not a Leap Year 💥💥💥 ") } fmt.Println("------------------------") } } func main() { Birthday() }
运行说明
修复后代码会依次尝试两种日期格式解析,同时修正了字段映射和闰年判断逻辑,可正确识别users.json中所有的日期格式,输出正确的闰年判断结果。
内容的提问来源于stack exchange,提问作者karim Salim
相关产品推荐
相关产品推荐

