为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中将时间字符串解组为 time.Time?

如何在 golang 中将时间字符串解组为 time.Time?

Go
慕妹3242003 2023-03-15 14:40:48
我正在使用 JOIN、CONCAT、GROUP_CONCAT、JSON_OBJECT 从多个表中读取数据。使用 gorm 将数据读入下面提到的模型。type OrgUserDisPublisherData struct {    Disciplines datatypes.JSON `json:"disciplines" example:"[]"`    User        datatypes.JSON `json:"user"`}此过程已成功完成。但是当我尝试将其解组OrgUserDisPublisherData.Disciplines为另一个具有time.Time数据类型的结构时。我收到以下错误 parsing time "\"2022-11-03 07:08:09.000000\"" as "\"2006-01-02T15:04:05Z07:00\"": cannot parse " 07:08:09.000000\"" as "T"用于解组的最终模型type Discipline struct {        Name              string    `json:"name"`        Code              string    `json:"code"`        IsPrimary         uint      `json:"isPrimary"`        IsAligned         uint      `json:"isAligned"`        IsTrainingFaculty uint      `json:"isTrainingFaculty"`        AlignmentDate     time.Time `json:"alignmentDate"`        UnalignmentDate   time.Time `json:"UnalignmentDate"`        ExpiryDate        time.Time `json:"expiryDate"`        ExternalId        string    `json:"externalId"`        Status            string    `json:"status"`        CreatedAt         time.Time `json:"createdAt"`        UpdatedAt         time.Time `json:"updatedAt"`    }同时,在向表中插入数据时使用了相同的模型,并且不会抛出任何与时间相关的错误。我如何在解组时处理时间,而不管针对时间属性存在的数据如何?
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

这里的问题是 GoLang 结构中日期/时间类型的默认 JSON 编组行为是使用 ISO8601 格式的日期/时间字符串。

这由错误消息中的格式字符串标识,带有T日期和时间之间的分隔符以及时区后缀。JSON 字符串中的值Discipline不符合此格式,缺少T分隔符和任何时区。因此错误。

如果您可以影响 gorm 生成的 JSON 字符串的格式(我不熟悉,所以不能说您是否可以或如何这样做),那么最简单的解决方案是确保您的 JSON 字符串时间字段是格式为 ISO8601/RFC3339 字符串。

如果你无法控制它,那么你有两个选择:

  1. 通过中间体对 JSON 进行一些预处理map[string]any并重新格式化适当的字段。如果gorm格式至少是一致的,那么这可能就像在空格上拆分字符串一样简单,从时间中删除最后的 3dps,附加一个适当的时区(或者只是如果时间是 UTC)然后用分隔符重新Z组装T

  2. 将自定义时间类型与json.Marshaller可以正确处理gorm格式化值的实现一起使用(您仍然需要知道哪个时区适用于持久值并在编组时正确应用)。

这两者都容易受到日期/时间变量的 gorm 格式更改和误用的影响(在选项 #1 的情况下未能进行预处理,在选项 #2 的情况下错误地使用而不是自定义类型time.Time) .

出于这个原因,如果可能的话,修改格式化输出gorm将是我的首选方法。


查看完整回答
反对 回复 2023-03-15
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

最快的解决方案是按照@Deltics 的建议,在从数据库中读取数据/值时对其进行格式化。

在从数据库查询数据时,使用 DATE_FORMAT() 我将数据格式化为 go/json 所需的格式

DATE_FORMAT(actual_data, '%Y-%m-%dT%TZ')


查看完整回答
反对 回复 2023-03-15
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信