>  기사  >  백엔드 개발  >  Go에서 형식이 잘못된 날짜/시간 문자열을 역마샬링하는 방법은 무엇입니까?

Go에서 형식이 잘못된 날짜/시간 문자열을 역마샬링하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 18:17:01283검색

How to Unmarshal Incorrectly Formatted Datetime Strings in Go?

잘못된 형식의 날짜/시간 비정렬화

배경

Go에서 날짜/시간 문자열을 구문 분석하려고 할 때 time.Parse를 사용하면 시간대 오프셋 형식이 잘못되면 실패할 수 있습니다. 특히 RFC3339에서 요구하는 대로 오프셋이 " 02:00" 대신 " 0200"으로 지정된 경우.

질문

다음을 포함하는 JSON 파일 세트가 제공됩니다. 오프셋 형식이 잘못된 날짜/시간, JSON으로 다시 마샬링된 날짜/시간 형식을 변경하지 않고 Go에서 올바르게 정렬 해제하려면 어떻게 해야 합니까?

답변

사용자 정의 시간 필드

유효한 오프셋 형식과 유효하지 않은 오프셋 형식을 모두 처리하기 위해 고유한 사용자 정의 시간 필드 유형을 정의할 수 있습니다. 이를 통해 기본 비정렬화 동작을 재정의하고 두 가지 예상 형식 중 하나에 따라 날짜/시간 문자열을 수동으로 구문 분석할 수 있습니다.

구현 예

<code class="go">type MyTime struct {
    time.Time
}

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Remove quotes from JSON string (optional)
    s = s[1:len(s)-1]

    t, err := time.Parse(time.RFC3339Nano, s)
    if err != nil {
        t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s)
    }
    self.Time = t
    return
}

type Test struct {
    Time MyTime `json:"time"`
}</code>

이 예에서는 , UnmarshalJSON 메서드를 사용하여 기본 역마샬링 동작을 재정의합니다. 먼저 날짜/시간 문자열 주위의 따옴표를 제거한 다음 표준 time.RFC3339Nano 형식을 사용하여 구문 분석을 시도합니다. 실패하면 잘못된 형식("2006-01-02T15:04:05.999999999Z0700")도 구문 분석하려고 시도합니다.

JSON 메타데이터의 RFC3339Nano 형식

JSON의 사용자 정의 시간 필드에 RFC3339Nano 형식을 사용하도록 지정하려면 UnmarshalJSON 메서드에서와 동일한 형식 문자열을 사용하면 됩니다.

<code class="go">type Test struct {
    Time MyTime `json:"time,omitempty"`
}</code>

이는 시간 필드가 RFC3339Nano 형식의 문자열인 JSON입니다. JSON으로 다시 마샬링할 때 올바른 형식이 유지되는지 확인하기 위해 재정의된 MyTime 유형의 MarshalJSON 메서드가 사용됩니다.

위 내용은 Go에서 형식이 잘못된 날짜/시간 문자열을 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.