Go语言如何将JSON中的日期转为标准日期并判断是否为闰年
问题修复说明
- 你之前用
strconv.Itoa(users.Users[i].Date)转换失败是正常的:strconv.Itoa的入参是整型,而Date字段本身已经是字符串类型,不需要做这个转换。 - 时间解析报错的核心原因是你同时对同一个日期字符串执行两种格式的解析,只要匹配了第一种格式,第二种格式必然解析失败触发报错,正确逻辑是依次尝试不同格式,只要有一个成功就继续执行,全部失败再抛出错误。
- 你当前的闰年判断逻辑错误:
date.Day()取的是当月的日期数值,判断闰年需要用date.Year()取年份计算。 - 你提供的JSON文件存在多余的
-->、. --->非法字符,JSON语法不支持这类注释内容,需要删除才能正常反序列化。
修复后的完整代码
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "os" "time" ) // Users 存储用户数组的结构体 type Users struct { Users []User `json:"users"` } // User 单个用户信息结构体 type User struct { Firstname string `json:"fname"` Secondname string `json:"lname"` Date string `json:"date"` } // 多格式解析时间的工具函数,依次尝试支持的日期格式 func parseMultiFormatDate(dateStr string) (time.Time, error) { formats := []string{ "2006/01/02", "2006-01-02", } for _, format := range formats { date, err := time.Parse(format, dateStr) if err == nil { return date, nil } } return time.Time{}, fmt.Errorf("无法解析日期: %s,支持的格式为2006/01/02、2006-01-02", dateStr) } // 判断指定年份是否为闰年 func isLeapYear(year int) bool { return year%400 == 0 || (year%4 == 0 && year%100 != 0) } func main() { // 打开json文件 jsonFile, err := os.Open("users.json") if err != nil { log.Fatalf("打开文件失败: %v", err) } fmt.Println("成功打开 users.json") defer jsonFile.Close() // 读取文件内容 byteValue, err := ioutil.ReadAll(jsonFile) if err != nil { log.Fatalf("读取文件失败: %v", err) } // 反序列化JSON var users Users err = json.Unmarshal(byteValue, &users) if err != nil { log.Fatalf("JSON解析失败: %v", err) } // 遍历用户判断对应出生年份是否为闰年 for i := 0; i < len(users.Users); i++ { user := users.Users[i] date, err := parseMultiFormatDate(user.Date) if err != nil { log.Printf("跳过用户%s %s: %v", user.Firstname, user.Secondname, err) continue } fmt.Println("解析后的标准日期:", date) fmt.Println("用户名字: " + user.Firstname) fmt.Println("用户姓氏: " + user.Secondname) fmt.Println("用户出生日期: " + user.Date) if isLeapYear(date.Year()) { fmt.Println(user.Date, " 是闰年 ✨✨✨ ") } else { fmt.Println(user.Date, " 不是闰年 💥💥💥 ") } fmt.Println("---") } }
修正后的JSON文件
{ "users": [ { "Fname": "Johnny", "Lname":"mane", "date":"1982/01/08" }, { "Fname": "Wayne", "Lname":"Bruce", "date":"1965/01/30" }, { "Fname": "Gaga", "Lname":"Lady", "date":"1986/03/28" }, { "Fname": "radio", "Lname":"head", "date":"1988/02/29" }, { "Fname": "Mario", "Lname":"torres", "date":"1996/09/28" }, { "Fname": "robert", "Lname":"Alex", "date":"1991/12/01" }, { "Fname": "Julia", "Lname":"sevak", "date":"1991-03-07" }, { "Fname": "feb", "Lname":"robert", "date":"1995-01-31" } ] }
内容的提问来源于stack exchange,提问作者karim Salim
相关产品推荐
相关产品推荐

