Web/GoLang

[golang] time 타입 parsing 오류 , gorm bodyparse 해결방안

벨포트조던 2023. 9. 1.
반응형

문제

다른 포스팅에도 썼는데,

parsing time "\"2016-01-02 15:04:05\"" as "\"2006-01-02T15:04:05Z07:00\"": cannot parse " 15:04:05\"" as "T"

 

이런 에러가 난다. Go 에서는 날짜가 정말 문제가 많은것같다. 5년전에도 부장님이 이런 말을 했었는데... .

 

- fiber에서 bodyparse로 파싱이 안됨.

- custom으로 파싱을해도 gorm 에 입력이 안됨 

 

두가지 문제였다.

 

첫번째 문제는 지난번에 해결했었음

근데 두번째 문제가 해결이 안되었음

 

해결

코드를 보여준다

// HHMMTime 구조체를 정의합니다.
type HHMMTime struct {
	time.Time
}

// Value 메서드는 데이터베이스에 값을 쓸 때 호출됩니다.
func (ct HHMMTime) Value() (driver.Value, error) {
	// 시간을 "hh:mm" 형식의 문자열로 변환하여 데이터베이스에 전달합니다.
	return ct.Format("15:04"), nil
}

// Scan 메서드는 데이터베이스에서 값을 읽을 때 호출됩니다.
func (ct *HHMMTime) Scan(value interface{}) error {
	if value == nil {
		return nil
	}
	strValue, ok := value.(string)
	if !ok {
		return fmt.Errorf("Invalid HHMMTime value")
	}

	// "hh:mm" 형식의 문자열을 시간으로 파싱합니다.
	parsedTime, err := time.Parse("15:04", strValue)
	if err != nil {
		return err
	}
	ct.Time = parsedTime
	return nil
}

const MyTimeFormat = "15:04"
const MyLocation = "Asia/Seoul"

func (ct *HHMMTime) UnmarshalJSON(bs []byte) error {
	var s string

	err := json.Unmarshal(bs, &s)
	if err != nil {
		return err
	}

	location, err := time.LoadLocation(MyLocation)
	if err != nil {
		return err
	}

	t, err := time.ParseInLocation(MyTimeFormat, s, location)
	if err != nil {
		return err
	}

	ct.Time = t

	return nil
}

아래 unmarshalJSON 이 bodyparse 하기 위한거고 

 

나머지 위에가 gorm 을 사용하기 위한 custom 사용방법이다. 

 

java는 이런게 잘 되는데 이건 뭐 이따구인지... 

 


문제가 또 생겼땅. ..

위처럼 하면 insert는 잘 되는데

select 가 문제다

 

큰 요지만 말하자면... DB에서 꺼내오는것은 문제가없다. ( 약간은 문제가 있는게 나는 HH:MM 을 저장해도  hh:mm:ss 로 DB에 저장됨 ) 

다만, Time.time 에 넣게되면 다시 HH:MM:SS 가 yyyy-mm-dd hh:mm:ss 로 바뀐다.

이러면 컨버팅해줘야하는게 수도없이 많다... 

 

그래서 ... 결심함'

go 에서는 날짜를 날짜로 저장하지 않을것이다. 거의 풀사이즈 날짜,시간데이터만 날짜로 저장하고, 날짜,시간의부분데이터는 문자열로 저장할것이다

반응형

댓글