2015-06-19 4 views

ответ

2

Так же, как вы бы реализовать json.Marshaler и json.Unmarshaler для этого с JSON (есть много сообщений о том, что на StackOverflow и в Интернете); Один из способов - реализовать пользовательский тип времени, который реализует encoding.TextMarshaler и encoding.TextUnmarshaler.

Эти интерфейсы используются при кодировании элементов encoding/xml (после первой проверки более конкретных интерфейсов xml.Marshaler или xml.Unmarshaler, однако эти более поздние должны выполнять полную кодировку XML).

E.g. что-то вроде (full example on the Go Playground):

const fixedFormat = "Mon Jan 02 2006" 

type myTime1 struct { 
    time.Time 
} 

func (m myTime1) MarshalText() ([]byte, error) { 
    text := m.Time.Format(fixedFormat) 
    return []byte(text), nil 
} 
func (m *myTime1) UnmarshalText(text []byte) error { 
    t, err := time.Parse(fixedFormat, string(text)) 
    if err == nil { 
     m.Time = t 
    } 
    return err 
} 

или

type myTime2 time.Time 

func (m myTime2) MarshalText() ([]byte, error) { 
    text := time.Time(m2).Format(fixedFormat) 
    return []byte(text), nil 
} 
func (m *myTime2) UnmarshalText(text []byte) error { 
    t, err := time.Parse(fixedFormat, string(text)) 
    if err == nil { 
     *m = myTime2(t) 
    } 
    return err 
} 

Любые из тех, может быть использован вместо time.Time как часть более крупной структурой данных, используемой с XML (ООН) маршалингом. Например .:

type Foo struct { 
    Date1 myTime1 `xml:"date1"` 
    Date2 myTime2 `xml:"date2"` 
} 

Разница в том, как эти пользовательские типы времени определяются изменения, как вы используете их с регулярными time.Time значениями. .

m1 := myTime1{time.Now()} 
fmt.Println(m1) 
if m1.Before(time.Now()) {} 
t1 := m1.Time 
// compared to: 
m2 := myTime2(time.Now()) 
fmt.Println(time.Time(m2)) 
if time.Time(m2).Before(time.Now()) {} 
t2 := time.Time(m2) 
0

Это зависит от того, как выглядит ваш формат, но хорошей отправной точкой является библиотека времени. http://golang.org/pkg/time/

layout := "2006-01-02T15:04:05.000Z" 
str := "2014-11-12T11:45:26.371Z" 
t, err := time.Parse(layout, str) 

if err != nil { 
    fmt.Println(err) 
} 
fmt.Println(t)