|
@@ -0,0 +1,625 @@
|
|
|
+package utils
|
|
|
+
|
|
|
+import (
|
|
|
+ "bufio"
|
|
|
+ "crypto/md5"
|
|
|
+ "crypto/sha1"
|
|
|
+ "encoding/base64"
|
|
|
+ "encoding/hex"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "image"
|
|
|
+ "image/png"
|
|
|
+ "io"
|
|
|
+ "math"
|
|
|
+ "math/rand"
|
|
|
+ "net/http"
|
|
|
+ "os"
|
|
|
+ "os/exec"
|
|
|
+ "path"
|
|
|
+ "regexp"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+//随机数种子
|
|
|
+var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
+
|
|
|
+func GetRandString(size int) string {
|
|
|
+ allLetterDigit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "!", "@", "#", "$", "%", "^", "&", "*"}
|
|
|
+ randomSb := ""
|
|
|
+ digitSize := len(allLetterDigit)
|
|
|
+ for i := 0; i < size; i++ {
|
|
|
+ randomSb += allLetterDigit[rnd.Intn(digitSize)]
|
|
|
+ }
|
|
|
+ return randomSb
|
|
|
+}
|
|
|
+
|
|
|
+func GetRandStringNoSpecialChar(size int) string {
|
|
|
+ allLetterDigit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
|
|
|
+ randomSb := ""
|
|
|
+ digitSize := len(allLetterDigit)
|
|
|
+ for i := 0; i < size; i++ {
|
|
|
+ randomSb += allLetterDigit[rnd.Intn(digitSize)]
|
|
|
+ }
|
|
|
+ return randomSb
|
|
|
+}
|
|
|
+
|
|
|
+func StringsToJSON(str string) string {
|
|
|
+ rs := []rune(str)
|
|
|
+ jsons := ""
|
|
|
+ for _, r := range rs {
|
|
|
+ rint := int(r)
|
|
|
+ if rint < 128 {
|
|
|
+ jsons += string(r)
|
|
|
+ } else {
|
|
|
+ jsons += "\\u" + strconv.FormatInt(int64(rint), 16) // json
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return jsons
|
|
|
+}
|
|
|
+
|
|
|
+//序列化
|
|
|
+func ToString(v interface{}) string {
|
|
|
+ data, _ := json.Marshal(v)
|
|
|
+ return string(data)
|
|
|
+}
|
|
|
+
|
|
|
+//md5加密
|
|
|
+func MD5(data string) string {
|
|
|
+ m := md5.Sum([]byte(data))
|
|
|
+ return hex.EncodeToString(m[:])
|
|
|
+}
|
|
|
+
|
|
|
+// 获取数字随机字符
|
|
|
+func GetRandDigit(n int) string {
|
|
|
+ return fmt.Sprintf("%0"+strconv.Itoa(n)+"d", rnd.Intn(int(math.Pow10(n))))
|
|
|
+}
|
|
|
+
|
|
|
+// 获取随机数
|
|
|
+func GetRandNumber(n int) int {
|
|
|
+ return rnd.Intn(n)
|
|
|
+}
|
|
|
+
|
|
|
+func GetRandInt(min, max int) int {
|
|
|
+ if min >= max || min == 0 || max == 0 {
|
|
|
+ return max
|
|
|
+ }
|
|
|
+ return rand.Intn(max-min) + min
|
|
|
+}
|
|
|
+
|
|
|
+func GetToday(format string) string {
|
|
|
+ today := time.Now().Format(format)
|
|
|
+ return today
|
|
|
+}
|
|
|
+
|
|
|
+//获取今天剩余秒数
|
|
|
+func GetTodayLastSecond() time.Duration {
|
|
|
+ today := GetToday(FormatDate) + " 23:59:59"
|
|
|
+ end, _ := time.ParseInLocation(FormatDateTime, today, time.Local)
|
|
|
+ return time.Duration(end.Unix()-time.Now().Local().Unix()) * time.Second
|
|
|
+}
|
|
|
+
|
|
|
+// 处理出生日期函数
|
|
|
+func GetBrithDate(idcard string) string {
|
|
|
+ l := len(idcard)
|
|
|
+ var s string
|
|
|
+ if l == 15 {
|
|
|
+ s = "19" + idcard[6:8] + "-" + idcard[8:10] + "-" + idcard[10:12]
|
|
|
+ return s
|
|
|
+ }
|
|
|
+ if l == 18 {
|
|
|
+ s = idcard[6:10] + "-" + idcard[10:12] + "-" + idcard[12:14]
|
|
|
+ return s
|
|
|
+ }
|
|
|
+ return GetToday(FormatDate)
|
|
|
+}
|
|
|
+
|
|
|
+//处理性别
|
|
|
+func WhichSexByIdcard(idcard string) string {
|
|
|
+ var sexs = [2]string{"女", "男"}
|
|
|
+ length := len(idcard)
|
|
|
+ if length == 18 {
|
|
|
+ sex, _ := strconv.Atoi(string(idcard[16]))
|
|
|
+ return sexs[sex%2]
|
|
|
+ } else if length == 15 {
|
|
|
+ sex, _ := strconv.Atoi(string(idcard[14]))
|
|
|
+ return sexs[sex%2]
|
|
|
+ }
|
|
|
+ return "男"
|
|
|
+}
|
|
|
+
|
|
|
+//截取小数点后几位
|
|
|
+func SubFloatToString(f float64, m int) string {
|
|
|
+ n := strconv.FormatFloat(f, 'f', -1, 64)
|
|
|
+ if n == "" {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ if m >= len(n) {
|
|
|
+ return n
|
|
|
+ }
|
|
|
+ newn := strings.Split(n, ".")
|
|
|
+ if m == 0 {
|
|
|
+ return newn[0]
|
|
|
+ }
|
|
|
+ if len(newn) < 2 || m >= len(newn[1]) {
|
|
|
+ return n
|
|
|
+ }
|
|
|
+ return newn[0] + "." + newn[1][:m]
|
|
|
+}
|
|
|
+
|
|
|
+//截取小数点后几位
|
|
|
+func SubFloatToFloat(f float64, m int) float64 {
|
|
|
+ newn := SubFloatToString(f, m)
|
|
|
+ newf, _ := strconv.ParseFloat(newn, 64)
|
|
|
+ return newf
|
|
|
+}
|
|
|
+
|
|
|
+//截取小数点后几位
|
|
|
+func SubFloatToFloatStr(f float64, m int) string {
|
|
|
+ newn := SubFloatToString(f, m)
|
|
|
+ return newn
|
|
|
+}
|
|
|
+
|
|
|
+//获取相差时间-年
|
|
|
+func GetYearDiffer(start_time, end_time string) int {
|
|
|
+ t1, _ := time.ParseInLocation("2006-01-02", start_time, time.Local)
|
|
|
+ t2, _ := time.ParseInLocation("2006-01-02", end_time, time.Local)
|
|
|
+ age := t2.Year() - t1.Year()
|
|
|
+ if t2.Month() < t1.Month() || (t2.Month() == t1.Month() && t2.Day() < t1.Day()) {
|
|
|
+ age--
|
|
|
+ }
|
|
|
+ return age
|
|
|
+}
|
|
|
+
|
|
|
+//获取相差时间-秒
|
|
|
+func GetSecondDifferByTime(start_time, end_time time.Time) int64 {
|
|
|
+ diff := end_time.Unix() - start_time.Unix()
|
|
|
+ return diff
|
|
|
+}
|
|
|
+
|
|
|
+func FixFloat(f float64, m int) float64 {
|
|
|
+ newn := SubFloatToString(f+0.00000001, m)
|
|
|
+ newf, _ := strconv.ParseFloat(newn, 64)
|
|
|
+ return newf
|
|
|
+}
|
|
|
+
|
|
|
+// 将字符串数组转化为逗号分割的字符串形式 ["str1","str2","str3"] >>> "str1,str2,str3"
|
|
|
+func StrListToString(strList []string) (str string) {
|
|
|
+ if len(strList) > 0 {
|
|
|
+ for k, v := range strList {
|
|
|
+ if k == 0 {
|
|
|
+ str = v
|
|
|
+ } else {
|
|
|
+ str = str + "," + v
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return ""
|
|
|
+}
|
|
|
+
|
|
|
+//Token
|
|
|
+func GetToken() string {
|
|
|
+ randStr := GetRandString(64)
|
|
|
+ token := MD5(randStr + Md5Key)
|
|
|
+ tokenLen := 64 - len(token)
|
|
|
+ return strings.ToUpper(token + GetRandString(tokenLen))
|
|
|
+}
|
|
|
+
|
|
|
+//数据没有记录
|
|
|
+func ErrNoRow() string {
|
|
|
+ return "<QuerySeter> no row found"
|
|
|
+}
|
|
|
+
|
|
|
+//校验邮箱格式
|
|
|
+func ValidateEmailFormatat(email string) bool {
|
|
|
+ reg := regexp.MustCompile(RegularEmail)
|
|
|
+ return reg.MatchString(email)
|
|
|
+}
|
|
|
+
|
|
|
+//验证是否是手机号
|
|
|
+func ValidateMobileFormatat(mobileNum string) bool {
|
|
|
+ reg := regexp.MustCompile(RegularMobile)
|
|
|
+ return reg.MatchString(mobileNum)
|
|
|
+}
|
|
|
+
|
|
|
+//判断文件是否存在
|
|
|
+func FileIsExist(filePath string) bool {
|
|
|
+ _, err := os.Stat(filePath)
|
|
|
+ return err == nil || os.IsExist(err)
|
|
|
+}
|
|
|
+
|
|
|
+//获取图片扩展名
|
|
|
+func GetImgExt(file string) (ext string, err error) {
|
|
|
+ var headerByte []byte
|
|
|
+ headerByte = make([]byte, 8)
|
|
|
+ fd, err := os.Open(file)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ defer fd.Close()
|
|
|
+ _, err = fd.Read(headerByte)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ xStr := fmt.Sprintf("%x", headerByte)
|
|
|
+ switch {
|
|
|
+ case xStr == "89504e470d0a1a0a":
|
|
|
+ ext = ".png"
|
|
|
+ case xStr == "0000010001002020":
|
|
|
+ ext = ".ico"
|
|
|
+ case xStr == "0000020001002020":
|
|
|
+ ext = ".cur"
|
|
|
+ case xStr[:12] == "474946383961" || xStr[:12] == "474946383761":
|
|
|
+ ext = ".gif"
|
|
|
+ case xStr[:10] == "0000020000" || xStr[:10] == "0000100000":
|
|
|
+ ext = ".tga"
|
|
|
+ case xStr[:8] == "464f524d":
|
|
|
+ ext = ".iff"
|
|
|
+ case xStr[:8] == "52494646":
|
|
|
+ ext = ".ani"
|
|
|
+ case xStr[:4] == "4d4d" || xStr[:4] == "4949":
|
|
|
+ ext = ".tiff"
|
|
|
+ case xStr[:4] == "424d":
|
|
|
+ ext = ".bmp"
|
|
|
+ case xStr[:4] == "ffd8":
|
|
|
+ ext = ".jpg"
|
|
|
+ case xStr[:2] == "0a":
|
|
|
+ ext = ".pcx"
|
|
|
+ default:
|
|
|
+ ext = ""
|
|
|
+ }
|
|
|
+ return ext, nil
|
|
|
+}
|
|
|
+
|
|
|
+//保存图片
|
|
|
+func SaveImage(path string, img image.Image) (err error) {
|
|
|
+ //需要保持的文件
|
|
|
+ imgfile, err := os.Create(path)
|
|
|
+ defer imgfile.Close()
|
|
|
+ // 以PNG格式保存文件
|
|
|
+ err = png.Encode(imgfile, img)
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+//下载图片
|
|
|
+func DownloadImage(imgUrl string) (filePath string, err error) {
|
|
|
+ imgPath := "./static/imgs/"
|
|
|
+ fileName := path.Base(imgUrl)
|
|
|
+ res, err := http.Get(imgUrl)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("A error occurred!")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ // 获得get请求响应的reader对象
|
|
|
+ reader := bufio.NewReaderSize(res.Body, 32*1024)
|
|
|
+
|
|
|
+ filePath = imgPath + fileName
|
|
|
+ file, err := os.Create(filePath)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 获得文件的writer对象
|
|
|
+ writer := bufio.NewWriter(file)
|
|
|
+
|
|
|
+ written, _ := io.Copy(writer, reader)
|
|
|
+ fmt.Printf("Total length: %d \n", written)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//保存base64数据为文件
|
|
|
+func SaveBase64ToFile(content, path string) error {
|
|
|
+ data, err := base64.StdEncoding.DecodeString(content)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ f, err := os.Create(path)
|
|
|
+ defer f.Close()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ f.Write(data)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func SaveBase64ToFileBySeek(content, path string) (err error) {
|
|
|
+ data, err := base64.StdEncoding.DecodeString(content)
|
|
|
+ exist, err := PathExists(path)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if !exist {
|
|
|
+ f, err := os.Create(path)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ n, _ := f.Seek(0, 2)
|
|
|
+ // 从末尾的偏移量开始写入内容
|
|
|
+ _, err = f.WriteAt([]byte(data), n)
|
|
|
+ defer f.Close()
|
|
|
+ } else {
|
|
|
+ f, err := os.OpenFile(path, os.O_WRONLY, 0644)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ n, _ := f.Seek(0, 2)
|
|
|
+ // 从末尾的偏移量开始写入内容
|
|
|
+ _, err = f.WriteAt([]byte(data), n)
|
|
|
+ defer f.Close()
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func PathExists(path string) (bool, error) {
|
|
|
+ _, err := os.Stat(path)
|
|
|
+ if err == nil {
|
|
|
+ return true, nil
|
|
|
+ }
|
|
|
+ if os.IsNotExist(err) {
|
|
|
+ return false, nil
|
|
|
+ }
|
|
|
+ return false, err
|
|
|
+}
|
|
|
+
|
|
|
+func StartIndex(page, pagesize int) int {
|
|
|
+ if page > 1 {
|
|
|
+ return (page - 1) * pagesize
|
|
|
+ }
|
|
|
+ return 0
|
|
|
+}
|
|
|
+func PageCount(count, pagesize int) int {
|
|
|
+ if count%pagesize > 0 {
|
|
|
+ return count/pagesize + 1
|
|
|
+ } else {
|
|
|
+ return count / pagesize
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TrimHtml(src string) string {
|
|
|
+ //将HTML标签全转换成小写
|
|
|
+ re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
|
|
|
+ src = re.ReplaceAllStringFunc(src, strings.ToLower)
|
|
|
+
|
|
|
+ re, _ = regexp.Compile("\\<img[\\S\\s]+?\\>")
|
|
|
+ src = re.ReplaceAllString(src, "[图片]")
|
|
|
+
|
|
|
+ re, _ = regexp.Compile("class[\\S\\s]+?>")
|
|
|
+ src = re.ReplaceAllString(src, "")
|
|
|
+ re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
|
|
|
+ src = re.ReplaceAllString(src, "")
|
|
|
+ return strings.TrimSpace(src)
|
|
|
+}
|
|
|
+
|
|
|
+//1556164246 -> 2019-04-25 03:50:46 +0000
|
|
|
+//timestamp
|
|
|
+
|
|
|
+func TimeToTimestamp() {
|
|
|
+ fmt.Println(time.Unix(1556164246, 0).Format("2006-01-02 15:04:05"))
|
|
|
+}
|
|
|
+
|
|
|
+func ToUnicode(text string) string {
|
|
|
+ textQuoted := strconv.QuoteToASCII(text)
|
|
|
+ textUnquoted := textQuoted[1 : len(textQuoted)-1]
|
|
|
+ return textUnquoted
|
|
|
+}
|
|
|
+
|
|
|
+func VersionToInt(version string) int {
|
|
|
+ version = strings.Replace(version, ".", "", -1)
|
|
|
+ n, _ := strconv.Atoi(version)
|
|
|
+ return n
|
|
|
+}
|
|
|
+func IsCheckInList(list []int, s int) bool {
|
|
|
+ for _, v := range list {
|
|
|
+ if v == s {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func round(num float64) int {
|
|
|
+ return int(num + math.Copysign(0.5, num))
|
|
|
+}
|
|
|
+
|
|
|
+func toFixed(num float64, precision int) float64 {
|
|
|
+ output := math.Pow(10, float64(precision))
|
|
|
+ return float64(round(num*output)) / output
|
|
|
+}
|
|
|
+
|
|
|
+// GetWilsonScore returns Wilson Score
|
|
|
+func GetWilsonScore(p, n float64) float64 {
|
|
|
+ if p == 0 && n == 0 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+
|
|
|
+ return toFixed(((p+1.9208)/(p+n)-1.96*math.Sqrt(p*n/(p+n)+0.9604)/(p+n))/(1+3.8416/(p+n)), 2)
|
|
|
+}
|
|
|
+
|
|
|
+//将中文数字转化成数字,比如 第三百四十五章,返回第345章 不支持一亿及以上
|
|
|
+func ChangeWordsToNum(str string) (numStr string) {
|
|
|
+ words := ([]rune)(str)
|
|
|
+ num := 0
|
|
|
+ n := 0
|
|
|
+ for i := 0; i < len(words); i++ {
|
|
|
+ word := string(words[i : i+1])
|
|
|
+ switch word {
|
|
|
+ case "万":
|
|
|
+ if n == 0 {
|
|
|
+ n = 1
|
|
|
+ }
|
|
|
+ n = n * 10000
|
|
|
+ num = num*10000 + n
|
|
|
+ n = 0
|
|
|
+ case "千":
|
|
|
+ if n == 0 {
|
|
|
+ n = 1
|
|
|
+ }
|
|
|
+ n = n * 1000
|
|
|
+ num += n
|
|
|
+ n = 0
|
|
|
+ case "百":
|
|
|
+ if n == 0 {
|
|
|
+ n = 1
|
|
|
+ }
|
|
|
+ n = n * 100
|
|
|
+ num += n
|
|
|
+ n = 0
|
|
|
+ case "十":
|
|
|
+ if n == 0 {
|
|
|
+ n = 1
|
|
|
+ }
|
|
|
+ n = n * 10
|
|
|
+ num += n
|
|
|
+ n = 0
|
|
|
+ case "一":
|
|
|
+ n += 1
|
|
|
+ case "二":
|
|
|
+ n += 2
|
|
|
+ case "三":
|
|
|
+ n += 3
|
|
|
+ case "四":
|
|
|
+ n += 4
|
|
|
+ case "五":
|
|
|
+ n += 5
|
|
|
+ case "六":
|
|
|
+ n += 6
|
|
|
+ case "七":
|
|
|
+ n += 7
|
|
|
+ case "八":
|
|
|
+ n += 8
|
|
|
+ case "九":
|
|
|
+ n += 9
|
|
|
+ case "零":
|
|
|
+ default:
|
|
|
+ if n > 0 {
|
|
|
+ num += n
|
|
|
+ n = 0
|
|
|
+ }
|
|
|
+ if num == 0 {
|
|
|
+ numStr += word
|
|
|
+ } else {
|
|
|
+ numStr += strconv.Itoa(num) + word
|
|
|
+ num = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if n > 0 {
|
|
|
+ num += n
|
|
|
+ n = 0
|
|
|
+ }
|
|
|
+ if num != 0 {
|
|
|
+ numStr += strconv.Itoa(num)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func Sha1(data string) string {
|
|
|
+ sha1 := sha1.New()
|
|
|
+ sha1.Write([]byte(data))
|
|
|
+ return hex.EncodeToString(sha1.Sum([]byte("")))
|
|
|
+}
|
|
|
+
|
|
|
+func GetVideoPlaySeconds(videoPath string) (playSeconds float64, err error) {
|
|
|
+ cmd := `ffmpeg -i ` + videoPath + ` 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//`
|
|
|
+ out, err := exec.Command("bash", "-c", cmd).Output()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ outTimes := string(out)
|
|
|
+ fmt.Println("outTimes:", outTimes)
|
|
|
+ if outTimes != "" {
|
|
|
+ timeArr := strings.Split(outTimes, ":")
|
|
|
+ h := timeArr[0]
|
|
|
+ m := timeArr[1]
|
|
|
+ s := timeArr[2]
|
|
|
+ hInt, err := strconv.Atoi(h)
|
|
|
+ if err != nil {
|
|
|
+ return playSeconds, err
|
|
|
+ }
|
|
|
+
|
|
|
+ mInt, err := strconv.Atoi(m)
|
|
|
+ if err != nil {
|
|
|
+ return playSeconds, err
|
|
|
+ }
|
|
|
+ s = strings.Trim(s, " ")
|
|
|
+ s = strings.Trim(s, "\n")
|
|
|
+ sInt, err := strconv.ParseFloat(s, 64)
|
|
|
+ if err != nil {
|
|
|
+ return playSeconds, err
|
|
|
+ }
|
|
|
+ playSeconds = float64(hInt)*3600 + float64(mInt)*60 + float64(sInt)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func GetMaxTradeCode(tradeCode string) (maxTradeCode string, err error) {
|
|
|
+ tradeCode = strings.Replace(tradeCode, "W", "", -1)
|
|
|
+ tradeCode = strings.Trim(tradeCode, " ")
|
|
|
+ tradeCodeInt, err := strconv.Atoi(tradeCode)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tradeCodeInt = tradeCodeInt + 1
|
|
|
+ maxTradeCode = fmt.Sprintf("W%06d", tradeCodeInt)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// excel日期字段格式化 yyyy-mm-dd
|
|
|
+func ConvertToFormatDay(excelDaysString string) string {
|
|
|
+ // 2006-01-02 距离 1900-01-01的天数
|
|
|
+ baseDiffDay := 38719 //在网上工具计算的天数需要加2天,什么原因没弄清楚
|
|
|
+ curDiffDay := excelDaysString
|
|
|
+ b, _ := strconv.Atoi(curDiffDay)
|
|
|
+ // 获取excel的日期距离2006-01-02的天数
|
|
|
+ realDiffDay := b - baseDiffDay
|
|
|
+ //fmt.Println("realDiffDay:",realDiffDay)
|
|
|
+ // 距离2006-01-02 秒数
|
|
|
+ realDiffSecond := realDiffDay * 24 * 3600
|
|
|
+ //fmt.Println("realDiffSecond:",realDiffSecond)
|
|
|
+ // 2006-01-02 15:04:05距离1970-01-01 08:00:00的秒数 网上工具可查出
|
|
|
+ baseOriginSecond := 1136185445
|
|
|
+ resultTime := time.Unix(int64(baseOriginSecond+realDiffSecond), 0).Format("2006-01-02")
|
|
|
+ return resultTime
|
|
|
+}
|
|
|
+
|
|
|
+func CheckPwd(pwd string) bool {
|
|
|
+ compile := `([0-9a-z]+){6,12}|(a-z0-9]+){6,12}`
|
|
|
+ reg := regexp.MustCompile(compile)
|
|
|
+ flag := reg.MatchString(pwd)
|
|
|
+ return flag
|
|
|
+}
|
|
|
+
|
|
|
+func GetMonthStartAndEnd(myYear string, myMonth string) (startDate, endDate string) {
|
|
|
+ // 数字月份必须前置补零
|
|
|
+ if len(myMonth) == 1 {
|
|
|
+ myMonth = "0" + myMonth
|
|
|
+ }
|
|
|
+ yInt, _ := strconv.Atoi(myYear)
|
|
|
+
|
|
|
+ timeLayout := "2006-01-02 15:04:05"
|
|
|
+ loc, _ := time.LoadLocation("Local")
|
|
|
+ theTime, _ := time.ParseInLocation(timeLayout, myYear+"-"+myMonth+"-01 00:00:00", loc)
|
|
|
+ newMonth := theTime.Month()
|
|
|
+
|
|
|
+ t1 := time.Date(yInt, newMonth, 1, 0, 0, 0, 0, time.Local).Format("2006-01-02")
|
|
|
+ t2 := time.Date(yInt, newMonth+1, 0, 0, 0, 0, 0, time.Local).Format("2006-01-02")
|
|
|
+ return t1, t2
|
|
|
+}
|
|
|
+
|
|
|
+//移除字符串中的空格
|
|
|
+func TrimStr(str string) (str2 string) {
|
|
|
+ return strings.Replace(str, " ", "", -1)
|
|
|
+}
|
|
|
+
|
|
|
+//字符串转换为time
|
|
|
+func StrTimeToTime(strTime string) time.Time {
|
|
|
+ timeLayout := "2006-01-02 15:04:05" //转化所需模板
|
|
|
+ loc, _ := time.LoadLocation("Local") //重要:获取时区
|
|
|
+ resultTime, _ := time.ParseInLocation(timeLayout, strTime, loc)
|
|
|
+ return resultTime
|
|
|
+}
|