package utils import ( "bytes" "fmt" "io/ioutil" "reflect" "regexp" "strconv" "strings" "time" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" ) // GetTypeName 获取参数类型 func GetTypeName(v interface{}) string { return reflect.TypeOf(v).String() } // Btoi 布尔值转整形 func Btoi(b bool) int { if b { return 1 } return 0 } // Itoa 整型转字符串 func Itoa(i int) string { return strconv.Itoa(i) } // Atoi 转换成整型 func Atoi(s string, d ...int) int { i, err := strconv.Atoi(s) if err != nil { if len(d) > 0 { return d[0] } else { return 0 } } return i } // AtoUi 转换成无符号整型 func AtoUi(s string) uint { return uint(Atoi64(s)) } // Atoi64 转换成整型int64 func Atoi64(s string, d ...int64) int64 { i, err := strconv.ParseInt(s, 10, 64) if err != nil { if len(d) > 0 { return d[0] } else { return 0 } } return i } // AtoUi64 转换成整型float64 func AtoUi64(s string, d ...uint64) uint64 { i, err := strconv.ParseUint(s, 10, 64) if err != nil { if len(d) > 0 { return d[0] } else { return 0 } } return i } // Atof 转换成float32整型 func Atof(s string, d ...float32) float32 { f, err := strconv.ParseFloat(s, 32) if err != nil { if len(d) > 0 { return d[0] } else { return 0 } } return float32(f) } // Atof64 转换成整型float64 func Atof64(s string, d ...float64) float64 { f, err := strconv.ParseFloat(s, 64) if err != nil { if len(d) > 0 { return d[0] } else { return 0 } } return f } // UitoA 32位无符号整形转字符串 func UitoA(i uint) string { return strconv.FormatUint(uint64(i), 10) } // Ui32toA 32位无符号整形转字符串 func Ui32toA(i uint32) string { return strconv.FormatUint(uint64(i), 10) } // Ui64toA 64位无符号整形转字符串 func Ui64toA(i uint64) string { return strconv.FormatUint(i, 10) } // I64toA 64位整形转字符串 func I64toA(i int64) string { return strconv.FormatInt(i, 10) } // F32toA 32位浮点数转字符串 func F32toA(f float32) string { return F64toA(float64(f)) } // F64toA 64位浮点数转字符串 func F64toA(f float64) string { return strconv.FormatFloat(f, 'f', -1, 64) } // DateFormat 日期格式化 func DateFormat(format string, t time.Time) string { patterns := []string{ // 年 "Y", "2006", // 4 位数字完整表示的年份 "y", "06", // 2 位数字表示的年份 // 月 "m", "01", // 数字表示的月份,有前导零 "n", "1", // 数字表示的月份,没有前导零 "M", "Jan", // 三个字母缩写表示的月份 "F", "January", // 月份,完整的文本格式,例如 January 或者 March // 日 "d", "02", // 月份中的第几天,有前导零的 2 位数字 "j", "2", // 月份中的第几天,没有前导零 "D", "Mon", // 星期几,文本表示,3 个字母 "l", "Monday", // 星期几,完整的文本格式;L的小写字母 // 时间 "g", "3", // 小时,12 小时格式,没有前导零 "G", "15", // 小时,24 小时格式,没有前导零 "h", "03", // 小时,12 小时格式,有前导零 "H", "15", // 小时,24 小时格式,有前导零 "a", "pm", // 小写的上午和下午值 "A", "PM", // 小写的上午和下午值 "i", "04", // 有前导零的分钟数 "s", "05", // 秒数,有前导零 } replacer := strings.NewReplacer(patterns...) format = replacer.Replace(format) return t.Format(format) } // StrToLocalTime 字符串转本地时间 func StrToLocalTime(value string) (time.Time, error) { if value == "" { return time.Time{}, nil } zoneName, offset := time.Now().Zone() zoneValue := offset / 3600 * 100 if zoneValue > 0 { value += fmt.Sprintf(" +%04d", zoneValue) } else { value += fmt.Sprintf(" -%04d", zoneValue) } if zoneName != "" { value += " " + zoneName } return StrToTime(value) } // StrToTime 字符串转时间 func StrToTime(value string) (time.Time, error) { if value == "" { return time.Time{}, nil } layouts := []string{ "2006-01-02 15:04:05 -0700 MST", "2006-01-02 15:04:05 -0700", "2006-01-02 15:04:05", "2006/01/02 15:04:05 -0700 MST", "2006/01/02 15:04:05 -0700", "2006/01/02 15:04:05", "2006-01-02 -0700 MST", "2006-01-02 -0700", "2006-01-02", "2006/01/02 -0700 MST", "2006/01/02 -0700", "2006/01/02", "2006-01-02 15:04:05 -0700 -0700", "2006/01/02 15:04:05 -0700 -0700", "2006-01-02 -0700 -0700", "2006/01/02 -0700 -0700", time.ANSIC, time.UnixDate, time.RubyDate, time.RFC822, time.RFC822Z, time.RFC850, time.RFC1123, time.RFC1123Z, time.RFC3339, time.RFC3339Nano, time.Kitchen, time.Stamp, time.StampMilli, time.StampMicro, time.StampNano, } var t time.Time var err error for _, layout := range layouts { t, err = time.ParseInLocation(layout, value, time.Local) if err == nil { return t, nil } } return time.Time{}, err } // StructToMap 结构转map func StructToMap(data interface{}) map[string]interface{} { result := make(map[string]interface{}) elem := reflect.ValueOf(data).Elem() size := elem.NumField() for i := 0; i < size; i++ { field := elem.Type().Field(i).Name value := elem.Field(i).Interface() result[field] = value } return result } // 带xml标签的Struct结构转map,用xml标注做key func XMLStructToMap(data interface{}) map[string]interface{} { result := make(map[string]interface{}) elem := reflect.ValueOf(data).Elem() size := elem.NumField() for i := 0; i < size; i++ { field := elem.Type().Field(i).Tag.Get("xml") value := elem.Field(i).Interface() result[field] = value } return result } // Ip2long IP转长整型 func Ip2long(ipstr string) (ip uint32) { r := `^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})` reg, err := regexp.Compile(r) if err != nil { return } ips := reg.FindStringSubmatch(ipstr) if ips == nil { return } ip1, _ := strconv.Atoi(ips[1]) ip2, _ := strconv.Atoi(ips[2]) ip3, _ := strconv.Atoi(ips[3]) ip4, _ := strconv.Atoi(ips[4]) if ip1 > 255 || ip2 > 255 || ip3 > 255 || ip4 > 255 { return } ip += uint32(ip1 * 0x1000000) ip += uint32(ip2 * 0x10000) ip += uint32(ip3 * 0x100) ip += uint32(ip4) return } // Long2ip 长整型转IP func Long2ip(ip uint32) string { return fmt.Sprintf("%d.%d.%d.%d", ip>>24, ip<<8>>24, ip<<16>>24, ip<<24>>24) } // GbkToUtf8 GBK转UTF-8 func GbkToUtf8(s []byte) ([]byte, error) { reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder()) d, e := ioutil.ReadAll(reader) if e != nil { return nil, e } return d, nil } // Utf8ToGbk UTF-8转GBK func Utf8ToGbk(s []byte) ([]byte, error) { reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder()) d, e := ioutil.ReadAll(reader) if e != nil { return nil, e } return d, nil }