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

自定义 time.Time 类型返回数据存储

自定义 time.Time 类型返回数据存储

Go
慕森卡 2022-01-04 10:52:07
我一直在处理来自 JSON POST 到我们的 Go API 的自定义时间格式的各种示例。我有一个 UnmarshalJSON 的覆盖函数,看起来一切正常。但是,当我将结构保存到数据存储中时,它不会被识别为 time.Time 值,因此不会被设置/保存。'toString' 函数打印出我希望在数据存储中看到的正确时间,但无法弄清楚如何转换它或将其转换为 time.Time 数据存储保存。这是我们正在构建的一个简单的日志记录 API 功能。请参阅下面的代码。我想就像将任意字符串转换为 time.Time 的 UnmarshalJSON 一样,然后转换为“Timestamp”(在这种情况下)是否有一个 Datastore 等价物在保存之前将其放回 time.Time?感谢您的任何帮助/指导。我确实有这样一个 'DateString' 是一个字符串值,当解组 'AppLog' 时通过 JSON 设置,然后我将它转换为 'Date' time.Time,但想要更“slick”并使用如果可能,UnmarshalJSON。package loggerimport (    "encoding/json"    "errors"    "fmt"    "io"    "io/ioutil"    "log"    "net/http"    "time"    "golang.org/x/net/context"    "google.golang.org/appengine"    "google.golang.org/appengine/datastore"    "github.com/gorilla/mux")func init() {    router := mux.NewRouter()    router.HandleFunc("/applogger", DoLog).Methods("POST")    http.Handle("/applogger/", router)}// DoLog --func DoLog(rw http.ResponseWriter, request *http.Request) {    var applog AppLog    body, err := ioutil.ReadAll(io.LimitReader(request.Body, 1048576))    if err != nil {        panic(err)    }    if err := request.Body.Close(); err != nil {        panic(err)    }    if err := json.Unmarshal(body, &applog); err != nil {        panic(err)    }    applog.IP = request.RemoteAddr    log.Print("my timestamp", applog.Date)    ctx := appengine.NewContext(request)    applog.Save(ctx)    fmt.Fprint(rw, "applogger - success")}// AppLog structtype AppLog struct {    Application string    `json:"application" datastore:"application"`    Platform    string    `json:"platform" datastore:"platform,noindex"`    Date        Timestamp `json:"date" datastore:"date"`    Data        string    `json:"data" datastore:"data,noindex"`    IP          string    `json:"-" datastore:"ip,noindex"`}// Save --func (al *AppLog) Save(ctx context.Context) *datastore.Key {    key := datastore.NewKey(ctx, "AppLog", "", 0, nil)    if _, err := datastore.Put(ctx, key, al); err != nil {        return nil    }    return key}
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

如果有很多结构,而您只是实现自定义编组和解组功能,那么要做的工作很多。您可以使用另一个库来代替,例如 json-iterator 扩展jsontime:


import "github.com/liamylian/jsontime"


var json = jsontime.ConfigWithCustomTimeFormat


type Book struct {

    Id        int           `json:"id"`

    UpdatedAt *time.Time    `json:"updated_at" time_format:"sql_date" time_utc:"true"`

    CreatedAt time.Time     `json:"created_at" time_format:"sql_datetime" time_location:"UTC"`

}


查看完整回答
反对 回复 2022-01-04
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

time.Time 已经有一个UnmarshalJSON 方法。它将从 RFC3339 格式的 JSON 字符串解组为 time.Time。

如果之后您需要其他字符串格式,则可以使用

(t *time.Time).Format(layout string)

使用任何所需的格式。


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

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