gpt4 book ai didi

json - 自定义时间。时间类型返回到数据存储区

转载 作者:IT王子 更新时间:2023-10-29 02:23:19 24 4
gpt4 key购买 nike

我一直在处理从 JSON POST 到我们的 Go API 的自定义时间格式的各种示例。我有一个 UnmarshalJSON 的重写函数,看起来一切正常。但是,当我将结构保存到数据存储区时,它没有被识别为时间。因此没有设置/保存时间值。 “toString”函数正在打印出我希望在数据存储中看到的正确时间,但不知道如何将其转换或转换为时间。数据存储保存的时间。这是我们正在构建的一个简单的日志记录 API 功能。请参阅下面的代码。

我想像 UnmarshalJSON 那样将任意字符串转换为 time.Time 然后转换为“Timestamp”(在本例中)是否有一个 Datastore 等效于在保存之前将其放回 time.Time?

感谢您提供的任何帮助/指导。我确实有这样一个 'DateString' 是在解码 'AppLog' 时通过 JSON 设置的字符串值,然后我将其转换为 'Date' time.Time,但想要更 'slick' 并利用如果可能,UnmarshalJSON。

package logger

import (
"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 struct
type 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
}

// Timestamp -- Generic Timestamp entity to handle different generic date formats
type Timestamp time.Time

const TimestampDateLayout1 = "2006-01-02 15:04:05 +0000"

func (t *Timestamp) UnmarshalJSON(b []byte) error {
ts, err := time.Parse(TimestampDateLayout1, string(b[1:len(b)-1]))
if err == nil {
log.Print("ts ", ts)
*t = Timestamp(ts)
log.Print("t ", t)
return nil
}

*t = Timestamp(time.Now())
return nil
}

func (t Timestamp) String() string {
return time.Time(t).String()
}

最佳答案

time.Time 有一个 UnmarshalJSON method已经。它将从 RFC3339 格式的 JSON 字符串解码为时间。时间。

如果之后你需要不同的字符串格式,你可以使用

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

使用所需的任何格式。

关于json - 自定义时间。时间类型返回到数据存储区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36563836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com