background/vendor/git.jiaxianghudong.com/go/utils/convert.go
2019-01-28 11:19:49 +08:00

330 lines
6.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}