Как отформатировать NullTime в удобочитаемый формат, например, ЧЧ: ММ: СС - PullRequest
0 голосов
/ 27 сентября 2019

Мне удалось изменить мой код, чтобы он правильно отображал все строки таблицы, даже если есть нулевые значения

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)
    }
}

{"status": 200, "message": "Success""," Data ": [{" 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 имеют (time.Time, error) хотеть (interface {})

1 Ответ

0 голосов
/ 27 сентября 2019

json.Marshal() ожидает одно значение, а time.Parse() возвращает 2 значения: проанализированное время и ошибку.Вы должны справиться с этим самостоятельно и не передавать его на 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"))
}

Тестирование:

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)

Вывод (попробуйте на Go Playground):

null <nil>
"17:09:00" <nil>

Также будьте осторожны с типом приемника.Вы использовали приемники указателей (ns *NullString), но вы используете NullString как не указатели в структуре LogItem.Это означает, что при маршалинге значений вашего LogItem этот NullString.MarshalJSON() не будет вызван.Поэтому вместо этого используйте приемник без указателя.

func (ns NullString) MarshalJSON() ([]byte, error) {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...