You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:27:01