如何在GO struct中处理JSON的日期字段 实现指定格式导出Excel
实现步骤
你可以通过自定义支持JSON反序列化的时间类型,结合Go标准库time完成需求,具体操作如下:
1. 自定义适配日期格式的时间类型
你JSON里的日期是2006-01-02T15:04:05.000-0700格式,自定义类型实现JSON反序列化接口,反序列化时自动把字符串转成标准时间类型:
package main import "time" // CustomTime 自定义可序列化时间类型 type CustomTime time.Time // 匹配JSON日期格式的布局字符串 const jiraTimeLayout = "2006-01-02T15:04:05.000-0700" // UnmarshalJSON 实现JSON反序列化接口 func (ct *CustomTime) UnmarshalJSON(data []byte) error { // 处理空值、null的情况 if len(data) < 2 || string(data) == `""` || string(data) == "null" { *ct = CustomTime(time.Time{}) return nil } // 移除JSON字符串两端的引号 timeStr := string(data[1 : len(data)-1]) // 按指定布局解析时间 parseTime, err := time.Parse(jiraTimeLayout, timeStr) if err != nil { return err } *ct = CustomTime(parseTime) return nil } // Time 快速转为标准time.Time类型 func (ct CustomTime) Time() time.Time { return time.Time(ct) }
2. 修改结构体字段类型
把原本的string类型替换为自定义的CustomTime:
// 你的字段结构体修改后示例 type Fields struct { Resolved CustomTime `json:"resolutiondate,omitempty"` Created CustomTime `json:"created,omitempty"` Updated CustomTime `json:"updated,omitempty"` // 其余字段保持不变 }
JSON反序列化时会自动调用你实现的UnmarshalJSON方法,不用额外手动处理转换逻辑。
3. 导出Excel时指定日期格式
主流Go Excel库(比如excelize、xlsx)都原生支持time.Time类型识别,你可以直接写入时间值后设置单元格格式为mm/dd/yyyy,这样Excel会识别为日期类型而非字符串:
示例(基于excelize库):
// 1. 转换为标准time.Time类型 createdTime := yourStruct.Fields.Created.Time() // 跳过空值 if createdTime.IsZero() { // 空值逻辑自行处理,比如填空字符串 } // 2. 写入单元格值,excelize会自动识别为日期类型 file.SetCellValue("Sheet1", "A2", createdTime) // 3. 设置单元格格式为mm/dd/yyyy dateStyle, err := file.NewStyle(&excelize.Style{ NumFmt: 14, // 内置格式14对应mm/dd/yyyy,也可以自定义为"mm/dd/yyyy" }) if err == nil { file.SetCellStyle("Sheet1", "A2", "A2", dateStyle) }
如果你用的库不支持直接传入time.Time:
手动格式化为mm/dd/yyyy格式的字符串即可:
dateStr := createdTime.Format("01/02/2006")
注意:Go的时间布局必须用
2006-01-02 15:04:05这个固定参考时间的对应格式,01代表月、02代表日、2006代表年,刚好匹配你要的mm/dd/yyyy格式。
内容的提问来源于stack exchange,提问作者dig_123
相关产品推荐
相关产品推荐

