如何将NullTime格式化为人类可读的格式,例如HH:MM:SS

时间:2019-09-27 07:47:47

标签: json go methods time struct

我设法修改了代码,因此即使存在空值,它也能正确显示所有表行

type NullString struct {
    sql.NullString
}

func (ns *NullString) MarshalJSON() ([]byte, error) {
    if !ns.Valid {
        return []byte("null"), nil
    }
    return json.Marshal(ns.String)
}

type LogItem struct {
    UserId           string     `form:"userid" json:"userid"`
    UserDate         string     `form:"date" json:"date"`
    CheckinTime      NullString `form:"checkintime" json:"checkintime"`
    CheckinLocation  NullString `form:"checkinlocation" json:"checkinlocation"`
    CheckoutTime     NullString `form:"checkouttime" json:"checkouttime"`
    CheckoutLocation NullString `form:"checkoutlocation" json:"checkoutlocation"`
}

db := DBconnect()
defer db.Close()

rows, err := db.Query("SELECT * FROM oc_log")
if err != nil {
    log.Print(err)
}

for rows.Next() {
    if err := rows.Scan(&logItem.UserId, &logItem.UserDate, &logItem.CheckinTime, &logItem.CheckinLocation, &logItem.CheckoutTime, &logItem.CheckoutLocation); err != nil {
        log.Fatal(err.Error())
    } else {
        arrLogItem = append(arrLogItem, logItem)
    }
}
  

{       “状态”:200,       “ message”:“成功”,       “数据”:[           {               “ userid”:“ 9”,               “ date”:“ 2019-09-25T00:00:00Z”,               “ checkintime”:“ 0000-01-01T14:56:39 + 07:00”,               “ checkinlocation”:“(100,100)”,               “ checkouttime”:“ 0000-01-01T15:52:22 + 07:00”,               “ checkoutlocation”:“(100,100)”           },           {               “ userid”:“ 10”,               “ date”:“ 2019-09-27T00:00:00Z”,               “ checkintime”:“ 0000-01-01T14:04:44 + 07:00”,               “ checkinlocation”:“(123,321)”,               “ checkouttime”:null,               “ checkoutlocation”:null           }       ]}

现在的问题是如何将 0000-01-01T14:04:44 + 07:00 格式化为对用户友好的输出,例如 17:09:02 例子吗?

此代码无法编译:

func (ns *NullString) MarshalJSON() ([]byte, error) {
    if !ns.Valid {
        return []byte("null"), nil
    }
    return json.Marshal(time.Parse(time.RFC3339, ns.String))
}
  

调用json.Marshal的参数过多           有(时间,时间,错误)           想要(界面{})

1 个答案:

答案 0 :(得分:0)

json.Marshal()需要一个值,而time.Parse()返回2个值:已解析的时间和一个错误。您必须自己处理,而不要将其传递给createNewUserData,例如:

json.Marshal()

测试:

func (ns *NullString) MarshalJSON() ([]byte, error) {
    if !ns.Valid {
        return []byte("null"), nil
    }
    t, err := time.Parse(time.RFC3339, ns.String)
    if err != nil {
        return nil, err
    }
    return json.Marshal(t.Format("15:04:05"))
}

输出(在Go Playground上尝试):

ns := &NullString{}
data, err := json.Marshal(ns)
fmt.Println(string(data), err)

ns = &NullString{
    NullString: sql.NullString{
        String: time.Time{}.Add(time.Minute * 1029).Format(time.RFC3339),
        Valid:  true,
    },
}
data, err = json.Marshal(ns)
fmt.Println(string(data), err)

还请注意接收器的类型。您使用了指针接收器(null <nil> "17:09:00" <nil> ),但是在ns *NullString结构中将NullString用作非指针。这意味着在整理LogItem的值时,将不会调用此LogItem。因此,请改用非指针接收器。

NullString.MarshalJSON()