background/vendor/git.jiaxianghudong.com/go/utils/convert.go

330 lines
6.7 KiB
Go
Raw Normal View History

2019-01-28 11:19:49 +08:00
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
}