рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд┐рд░рджрд░реНрдж рд╣реИред рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рджрд╢рдорд▓рд╡ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдордп рдХреНрд╖реЗрддреНрд░ - рдореЗрд░реЗ рднрдЧрд╡рд╛рди, рд╡реЗ рд╕рд┐рд░реНрдл рдкреВрд░реНрдгрд╛рдВрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдХреЗ рдЕрдирдЧрд┐рдирдд рдкреНрд░рд╛рд░реВрдкред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЖрдИрдПрд╕рдУ 8601 рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдЗрдП рдмрддрд╛рддреЗ рд╣реИрдВ - рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдЗрд╕ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рд╡рд┐рджреЗрд╢ рдореЗрдВ рдХреИрд╕реЗ рд╣реЛ рд░рд╣реА рд╣реИрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕реЛрд╡рд┐рдпрдд рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдЧрд▓реЗ рд▓рдЧрд╛рдиреЗ рдФрд░ рд░реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд╕рдордп рдФрд░ рджрд┐рдирд╛рдВрдХ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред
рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрд╛рдпрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдЗрддрдиреА рдмреБрд░реА рдирд╣реАрдВ рд▓рдЧ рд░рд╣реА рдереА, рдПрдкреАрдЖрдИ рдореЗрдВ рддрд╛рд░реАрдЦ рдкреНрд░рд╛рд░реВрдк рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдерд╛: YYYY-MM-DD hh: mm: ss ред рд╕рд╛рдорд╛рдиреНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
рдирд╣реАрдВред
рдмрд┐рд▓реНрдХреБрд▓ рдЕрд╕рд╛рдорд╛рдиреНрдпред
рдЖрдИрдПрд╕рдУ 8601 рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреИрдЪ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП:
package main
import (
"encoding/json"
"log"
"time"
)
type Dated struct {
DateTime time.Time
}
func main() {
input := []byte("{\"datetime\": \"1900-01-01 12:00:04\"}")
var d Dated
err := json.Unmarshal(input, &d)
if err != nil {
log.Fatal(err)
}
}
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛? рдпрд╣ рд╕рд╣реА рд╣реИ, рддреНрд░реБрдЯрд┐:
parsing time ""1900-01-01 12:00:04"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 12:00:04"" as "T"
рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдмреЙрдХреНрд╕ рд╕реАрдорд┐рдд рд╕рдордп рдФрд░ рджрд┐рдирд╛рдВрдХ рд╕реНрд╡рд░реВрдкреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ
рдЬрд┐рд╕реЗ рд╡рд╣ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700"
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
рдпрд╣рд╛рдВ рд╕реЗ: https://golang.org/src/time/format.go
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рд╛рд░реВрдк YYYY-MM-DD hh:mm:ss
рдирд╣реАрдВ рд╣реИред рдареАрдХ рд╣реИ, рдореБрд╕реАрдмрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдХреНрдпрд╛ рдХрд░реЗрдВ?
, , Go json.Unmarshall
. тАФ , JSON, , , UnmasrhallJSON,
.
, ,
, Unmarshaler, UnmasrhallJSON:
type CustomDate struct {
time.Time
}
func (c *CustomDate) UnmarshalJSON(b []byte) (err error) {
layout := "2006-01-02 15:04:05"
s := strings.Trim(string(b), "\"")
if s == "null" {
return
}
c.Time, err = time.Parse(layout, s)
return
}
type Dated struct {
DateTime CustomDate
}
, , API, , , . :
package main
import (
"encoding/json"
"fmt"
"log"
"strings"
"time"
)
type CustomDate struct {
time.Time
}
const layout = "2006-01-02 15:04:05"
func (c *CustomDate) UnmarshalJSON(b []byte) (err error) {
s := strings.Trim(string(b), `"`)
if s == "null" {
return
}
c.Time, err = time.Parse(layout, s)
return
}
func (c CustomDate) MarshalJSON() ([]byte, error) {
if c.Time.IsZero() {
return nil, nil
}
return []byte(fmt.Sprintf(`"%s"`, c.Time.Format(layout))), nil
}
type Dated struct {
DateTime CustomDate
}
func main() {
input := []byte("{\"datetime\": \"1900-01-01 12:00:04\"}")
var d Dated
err := json.Unmarshal(input, &d)
if err != nil {
log.Fatal(err)
}
log.Println("Unmarshal:")
log.Println(d.DateTime)
b, err := json.Marshal(d)
if err != nil {
log.Fatal(err)
}
log.Println("Marshal:")
log.Println(string(b))
}
Marshal/Unmarshal. тАФ MarchalJSON , UnmarshalJSON тАФ
:
Unmarshal:
1900-01-01 12:00:04 +0000 UTC
Marshal:
{"DateTime":"1900-01-01T12:00:04Z"}
, , .
Go тАФ , , /, , ; тАФ .
рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ - рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдЦреИрд░, рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдкреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЗрдЪреНрдЫрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред