рдЧреЛ рдореЗрдВ рдорд╛рд░реНрд╢реНрд▓рд┐рдВрдЧ рдФрд░ рдЕрдирд╛рд░рдХреНрд╖рд┐рддрд┐рдВрдЧ рдХрд╕реНрдЯрдо рддрд┐рдерд┐ рдкреНрд░рд╛рд░реВрдк

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд┐рд░рджрд░реНрдж рд╣реИред рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рджрд╢рдорд▓рд╡ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдордп рдХреНрд╖реЗрддреНрд░ - рдореЗрд░реЗ рднрдЧрд╡рд╛рди, рд╡реЗ рд╕рд┐рд░реНрдл рдкреВрд░реНрдгрд╛рдВрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдХреЗ рдЕрдирдЧрд┐рдирдд рдкреНрд░рд╛рд░реВрдкред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЖрдИрдПрд╕рдУ 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" // RFC822 with numeric zone
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" // RFC1123 with numeric zone
RFC3339     = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen     = "3:04PM"
// Handy time stamps.
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), "\"") // remove quotes
    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), `"`) // remove quotes
    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 тАФ , , /, , ; тАФ .


рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ - рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдЦреИрд░, рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдкреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЗрдЪреНрдЫрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред


All Articles