問題:前端輸入的日期格式為: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,多了反序列化步驟
