golang 日期時間字符串處理支持多種格式(應對日期反序列化問題)


問題:前端輸入的日期格式為:yyyy-mm-dd,yyyy-m-d。時間格式為:hh:mm:ss,h:m:s,h,hh。總之,輸入的格式不一定固定。

解決辦法:寫一個日期時間字符串處理函數,將不規范的字符串格式統一為一種格式供go反序列化為time。

方法如下:

// 格式化日期字符串
func FormatTimeString(t string) string {
	var ret = ""
	timestr := strings.ReplaceAll(t, "/", "-")
	arr := strings.Split(timestr, " ")
	if len(arr) == 1 || len(arr) == 0 {
		ret = strings.Join([]string{arr[0], "00:00:00"}, " ")
	} else {
		switch strings.Count(arr[1], ":") {
		case 0:
			ret = strings.Join([]string{arr[0], strings.Join([]string{arr[1], ":00:00"}, "")}, " ")
			break
		case 1:
			ret = strings.Join([]string{arr[0], strings.Join([]string{arr[1], ":00"}, "")}, " ")
			break
		default:
			ret = timestr
			break
		}
	}
	return ret
}

 整體的代碼如下:

package lib

import (
	"encoding/json"
	"fmt"
	"strings"
	"time"

	"github.com/astaxie/beego/orm"
)

type Time struct {
	time.Time
}

const TimeFormat = "2006-1-2 15:4:5"

// MarshalJSON 序列化為JSON
func (t Time) MarshalJSON() ([]byte, error) {
	if t.IsZero() {
		return []byte("\"\""), nil
	}
	stamp := fmt.Sprintf("\"%s\"", t.Format(TimeFormat))
	return []byte(stamp), nil
}

// UnmarshalJSON json反序列化為time
func (t *Time) UnmarshalJSON(data []byte) error {
	var err error
	if len(data) >= 10 {
		t.Time, err = time.ParseInLocation(TimeFormat, FormatTimeString(string(data)), time.Local)
		//t.Time,err = time.Parse(TimeFormat,string(data))
	} else {
		t.Time = time.Time{}
	}
	return err
}

// String 重寫String方法
func (t *Time) String() string {
	data, _ := json.Marshal(t)
	return string(data)
}

// FieldType 數據類型
func (t *Time) FieldType() int {
	return orm.TypeDateTimeField

}

// SetRaw 讀取數據庫值
func (t *Time) SetRaw(value interface{}) error {
	switch value.(type) {
	case time.Time:
		t.Time = value.(time.Time)
	}
	return nil
}

// RawValue 寫入數據庫
func (t *Time) RawValue() interface{} {
	str := t.Format(TimeFormat)
	if str == "0001-01-01 00:00:00" {
		return nil
	}
	return str
}

// 格式化日期字符串
func FormatTimeString(t string) string {
	var ret = ""
	timestr := strings.ReplaceAll(t, "/", "-")
	arr := strings.Split(timestr, " ")
	if len(arr) == 1 || len(arr) == 0 {
		ret = strings.Join([]string{arr[0], "00:00:00"}, " ")
	} else {
		switch strings.Count(arr[1], ":") {
		case 0:
			ret = strings.Join([]string{arr[0], strings.Join([]string{arr[1], ":00:00"}, "")}, " ")
			break
		case 1:
			ret = strings.Join([]string{arr[0], strings.Join([]string{arr[1], ":00"}, "")}, " ")
			break
		default:
			ret = timestr
			break
		}
	}
	return ret
}

 經測試:TimeFormat = "2006-01-02 15:04:05"只能適配"yyyy-mm-dd hh:mm:ss"這種格式,不能適配月日小時分鍾秒不帶0的情形(如:2020-6-1)。而TimeFormat = "2006-1-2 15:4:5",這種可以適配帶0和不帶0兩種情形。

 

 日期時間作為查詢數據庫條件尤其是拼接sql類型的,個人不建議model中的字段用time,多了反序列化步驟


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM