parent
65da76425a
commit
b9831ccd29
@ -0,0 +1,57 @@
|
||||
package goaes
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"encoding/base64"
|
||||
)
|
||||
|
||||
// Encrypt 加密 aes_128_cbc
|
||||
func Encrypt(encryptStr string, key []byte, iv string) (string, error) {
|
||||
encryptBytes := []byte(encryptStr)
|
||||
block, err := aes.NewCipher(key)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
blockSize := block.BlockSize()
|
||||
encryptBytes = pkcs5Padding(encryptBytes, blockSize)
|
||||
|
||||
blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
|
||||
encrypted := make([]byte, len(encryptBytes))
|
||||
blockMode.CryptBlocks(encrypted, encryptBytes)
|
||||
return base64.URLEncoding.EncodeToString(encrypted), nil
|
||||
}
|
||||
|
||||
// Decrypt 解密
|
||||
func Decrypt(decryptStr string, key []byte, iv string) (string, error) {
|
||||
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
block, err := aes.NewCipher(key)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
|
||||
decrypted := make([]byte, len(decryptBytes))
|
||||
|
||||
blockMode.CryptBlocks(decrypted, decryptBytes)
|
||||
decrypted = pkcs5UnPadding(decrypted)
|
||||
return string(decrypted), nil
|
||||
}
|
||||
|
||||
func pkcs5Padding(cipherText []byte, blockSize int) []byte {
|
||||
padding := blockSize - len(cipherText)%blockSize
|
||||
padText := bytes.Repeat([]byte{byte(padding)}, padding)
|
||||
return append(cipherText, padText...)
|
||||
}
|
||||
|
||||
func pkcs5UnPadding(decrypted []byte) []byte {
|
||||
length := len(decrypted)
|
||||
unPadding := int(decrypted[length-1])
|
||||
return decrypted[:(length - unPadding)]
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package goarray
|
||||
|
||||
func Grouping() {
|
||||
|
||||
}
|
||||
|
||||
func TurnString(ss []string) (s string) {
|
||||
sl := len(ss)
|
||||
for k, v := range ss {
|
||||
if k+1 == sl {
|
||||
s = s + v
|
||||
} else {
|
||||
s = s + v + ","
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
|
||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
|
||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
|
||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
|
@ -0,0 +1,22 @@
|
||||
package goenv
|
||||
|
||||
import (
|
||||
"github.com/dtapps/go-library/utils/gostring"
|
||||
"os"
|
||||
)
|
||||
|
||||
func GetEnvDefault(key, defVal string) string {
|
||||
val, ok := os.LookupEnv(key)
|
||||
if ok {
|
||||
return val
|
||||
}
|
||||
return defVal
|
||||
}
|
||||
|
||||
func GetEnvDefaultInt(key string, defVal int) int {
|
||||
val, ok := os.LookupEnv(key)
|
||||
if ok {
|
||||
return gostring.ToInt(val)
|
||||
}
|
||||
return defVal
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package float
|
||||
|
||||
import "math"
|
||||
|
||||
// ToInt64 将float64转成精确的int64
|
||||
func ToInt64(num float64, retain int) int64 {
|
||||
return int64(num * math.Pow10(retain))
|
||||
}
|
||||
|
||||
// ToFloat64 精准float64
|
||||
func ToFloat64(num float64, retain int) float64 {
|
||||
return num * math.Pow10(retain)
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package goget
|
||||
|
||||
func GetDefault(key, defVal any) any {
|
||||
if key != nil {
|
||||
return key
|
||||
}
|
||||
return defVal
|
||||
}
|
||||
|
||||
func GetStringDefault(key, defVal string) string {
|
||||
if key != "" {
|
||||
return key
|
||||
}
|
||||
return defVal
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package goint
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// ToString int到string
|
||||
func ToString(n int) string {
|
||||
return strconv.Itoa(n)
|
||||
}
|
||||
|
||||
// ToFloat64 int到float64
|
||||
func ToFloat64(n int) float64 {
|
||||
return float64(n) / math.Pow10(0)
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package goint64
|
||||
|
||||
import "math"
|
||||
|
||||
// ToFloat64 int64到float64
|
||||
func ToFloat64(n int64) float64 {
|
||||
return float64(n) / math.Pow10(0)
|
||||
}
|
||||
|
||||
// ToUnwrap 将int64恢复成正常的float64
|
||||
func ToUnwrap(num int64, retain int) float64 {
|
||||
return float64(num) / math.Pow10(retain)
|
||||
}
|
||||
|
||||
// ToUnwrapToInt64 精准int64
|
||||
func ToUnwrapToInt64(num int64, retain int) int64 {
|
||||
return int64(ToUnwrap(num, retain))
|
||||
}
|
||||
|
||||
// ToFloat64NewWiFi 返回float64
|
||||
func ToFloat64NewWiFi(num int64) float64 {
|
||||
return float64(num / 100)
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package gojson
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
func Encode(v interface{}) (string, error) {
|
||||
bytes, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(bytes), nil
|
||||
}
|
||||
|
||||
func MarshalToString(msg interface{}) (string, error) {
|
||||
j, e := json.Marshal(msg)
|
||||
if e != nil {
|
||||
return "", e
|
||||
}
|
||||
return string(j), nil
|
||||
}
|
||||
|
||||
func JsonDecode(data string) (map[string]interface{}, error) {
|
||||
var dat map[string]interface{}
|
||||
err := json.Unmarshal([]byte(data), &dat)
|
||||
return dat, err
|
||||
}
|
||||
|
||||
func JsonDecodeNoError(data string) map[string]interface{} {
|
||||
var dat map[string]interface{}
|
||||
_ = json.Unmarshal([]byte(data), &dat)
|
||||
return dat
|
||||
}
|
||||
|
||||
func JsonEncode(data interface{}) (string, error) {
|
||||
jsons, err := json.Marshal(data)
|
||||
return string(jsons), err
|
||||
}
|
||||
|
||||
func JsonEncodeNoError(data interface{}) string {
|
||||
jsons, _ := json.Marshal(data)
|
||||
return string(jsons)
|
||||
}
|
||||
|
||||
func JsonDecodesNoError(data string) []string {
|
||||
var dat []string
|
||||
_ = json.Unmarshal([]byte(data), &dat)
|
||||
return dat
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package gomac
|
||||
|
||||
import (
|
||||
"net"
|
||||
)
|
||||
|
||||
func GetMacAddrs() (macAddrs []string) {
|
||||
netInterfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return macAddrs
|
||||
}
|
||||
for _, netInterface := range netInterfaces {
|
||||
macAddr := netInterface.HardwareAddr.String()
|
||||
if len(macAddr) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
macAddrs = append(macAddrs, macAddr)
|
||||
}
|
||||
return macAddrs
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package gomd5
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Php(str string) string {
|
||||
h := md5.New()
|
||||
io.WriteString(h, str)
|
||||
return fmt.Sprintf("%x", h.Sum(nil))
|
||||
}
|
||||
|
||||
func Md5(str string) string {
|
||||
s := md5.New()
|
||||
s.Write([]byte(str))
|
||||
return hex.EncodeToString(s.Sum(nil))
|
||||
}
|
||||
|
||||
// ToUpper md5加密后转大写
|
||||
func ToUpper(str string) string {
|
||||
h := md5.New()
|
||||
h.Write([]byte(str))
|
||||
cipherStr := h.Sum(nil)
|
||||
return strings.ToUpper(hex.EncodeToString(cipherStr))
|
||||
}
|
||||
|
||||
// ToLower md5加密后转小写
|
||||
func ToLower(str string) string {
|
||||
h := md5.New()
|
||||
h.Write([]byte(str))
|
||||
cipherStr := h.Sum(nil)
|
||||
return strings.ToLower(hex.EncodeToString(cipherStr))
|
||||
}
|
||||
|
||||
// GetMD5Encode 返回一个32位md5加密后的字符串
|
||||
func GetMD5Encode(data string) string {
|
||||
h := md5.New()
|
||||
h.Write([]byte(data))
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
||||
|
||||
// Get16MD5Encode 返回一个16位md5加密后的字符串
|
||||
func Get16MD5Encode(data string) string {
|
||||
return GetMD5Encode(data)[8:24]
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package goorder
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/dtapps/go-library/utils/gorandom"
|
||||
"github.com/dtapps/go-library/utils/gotime"
|
||||
)
|
||||
|
||||
// GenerateOrDate 生成订单号
|
||||
func GenerateOrDate[T string | int | int8 | int16 | int32 | int64](customId T) string {
|
||||
return fmt.Sprintf("%v%s%s", customId, gotime.Current().SetFormat("200601021504"), gorandom.Numeric(3))
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package gorandom
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
const numbers string = "0123456789"
|
||||
const letters string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
||||
const specials = "~!@#$%^*()_+-=[]{}|;:,./<>?"
|
||||
const alphanumerics string = letters + numbers
|
||||
const ascii string = alphanumerics + specials
|
||||
|
||||
func random(n int, chars string) string {
|
||||
if n <= 0 {
|
||||
return ""
|
||||
}
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
bytes := make([]byte, n, n)
|
||||
l := len(chars)
|
||||
for i := 0; i < n; i++ {
|
||||
bytes[i] = chars[r.Intn(l)]
|
||||
}
|
||||
return string(bytes)
|
||||
}
|
||||
|
||||
// Alphanumeric 随机字母数字
|
||||
func Alphanumeric(n int) string {
|
||||
return random(n, alphanumerics)
|
||||
}
|
||||
|
||||
// Alphabetic 随机字母
|
||||
func Alphabetic(n int) string {
|
||||
return random(n, letters)
|
||||
}
|
||||
|
||||
// Numeric 随机数字
|
||||
func Numeric(n int) string {
|
||||
return random(n, numbers)
|
||||
}
|
||||
|
||||
// Ascii 随机ASCII
|
||||
func Ascii(n int) string {
|
||||
return random(n, ascii)
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
package gorsa
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"encoding/pem"
|
||||
"os"
|
||||
)
|
||||
|
||||
// PublicEncrypt 公钥加密
|
||||
func PublicEncrypt(encryptStr string, path string) (string, error) {
|
||||
// 打开文件
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 读取文件内容
|
||||
info, _ := file.Stat()
|
||||
buf := make([]byte, info.Size())
|
||||
file.Read(buf)
|
||||
|
||||
// pem 解码
|
||||
block, _ := pem.Decode(buf)
|
||||
|
||||
// x509 解码
|
||||
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 类型断言
|
||||
publicKey := publicKeyInterface.(*rsa.PublicKey)
|
||||
|
||||
//对明文进行加密
|
||||
encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
//返回密文
|
||||
return base64.URLEncoding.EncodeToString(encryptedStr), nil
|
||||
}
|
||||
|
||||
// PrivateDecrypt 私钥解密
|
||||
func PrivateDecrypt(decryptStr string, path string) (string, error) {
|
||||
// 打开文件
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 获取文件内容
|
||||
info, _ := file.Stat()
|
||||
buf := make([]byte, info.Size())
|
||||
file.Read(buf)
|
||||
|
||||
// pem 解码
|
||||
block, _ := pem.Decode(buf)
|
||||
|
||||
// X509 解码
|
||||
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
|
||||
|
||||
//对密文进行解密
|
||||
decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes)
|
||||
|
||||
//返回明文
|
||||
return string(decrypted), nil
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package gosort
|
||||
|
||||
// QuickSort 快速排序算法
|
||||
// https://www.topgoer.com/Go%E9%AB%98%E7%BA%A7/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.html
|
||||
func QuickSort(arr []int) []int {
|
||||
if len(arr) <= 1 {
|
||||
return arr
|
||||
}
|
||||
splitdata := arr[0] //第一个数据
|
||||
low := make([]int, 0, 0) //比我小的数据
|
||||
hight := make([]int, 0, 0) //比我大的数据
|
||||
mid := make([]int, 0, 0) //与我一样大的数据
|
||||
mid = append(mid, splitdata) //加入一个
|
||||
for i := 1; i < len(arr); i++ {
|
||||
if arr[i] < splitdata {
|
||||
low = append(low, arr[i])
|
||||
} else if arr[i] > splitdata {
|
||||
hight = append(hight, arr[i])
|
||||
} else {
|
||||
mid = append(mid, arr[i])
|
||||
}
|
||||
}
|
||||
low, hight = QuickSort(low), QuickSort(hight)
|
||||
myarr := append(append(low, mid...), hight...)
|
||||
return myarr
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package gotime
|
||||
|
||||
import "time"
|
||||
|
||||
// Tomorrow 明天
|
||||
func Tomorrow() Pro {
|
||||
p := NewPro()
|
||||
location, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
p.Time = time.Now().Add(time.Hour*8).AddDate(0, 0, +1)
|
||||
} else {
|
||||
p.Time = time.Now().In(location).AddDate(0, 0, +1)
|
||||
}
|
||||
return p
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
package gotime
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 时间格式化常量
|
||||
const (
|
||||
RFC3339Format = time.RFC3339
|
||||
Iso8601Format = "2006-01-02T15:04:05-07:00"
|
||||
CookieFormat = "Monday, 02-Jan-2006 15:04:05 MST"
|
||||
RFC1036Format = "Mon, 02 Jan 06 15:04:05 -0700"
|
||||
RFC7231Format = "Mon, 02 Jan 2006 15:04:05 GMT"
|
||||
DayDateTimeFormat = "Mon, Jan 2, 2006 3:04 PM"
|
||||
DateTimeFormat = "2006-01-02 15:04:05"
|
||||
DateFormat = "2006-01-02"
|
||||
TimeFormat = "15:04:05"
|
||||
ShortDateTimeFormat = "20060102150405"
|
||||
ShortDateFormat = "20060102"
|
||||
ShortTimeFormat = "150405"
|
||||
)
|
||||
|
||||
// Pro 结构体
|
||||
type Pro struct {
|
||||
Time time.Time
|
||||
loc *time.Location
|
||||
Error error
|
||||
}
|
||||
|
||||
// NewPro 初始化结构体
|
||||
func NewPro() Pro {
|
||||
return Pro{
|
||||
Time: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
// BeforeSeconds 获取n秒前的时间
|
||||
func (p Pro) BeforeSeconds(seconds int) Pro {
|
||||
st, _ := time.ParseDuration(fmt.Sprintf("-%ds", seconds))
|
||||
p.Time = p.Time.Add(st)
|
||||
return p
|
||||
}
|
||||
|
||||
// AfterSeconds 获取n秒后的时间
|
||||
func (p Pro) AfterSeconds(seconds int) Pro {
|
||||
st, _ := time.ParseDuration(fmt.Sprintf("+%ds", seconds))
|
||||
p.Time = p.Time.Add(st)
|
||||
return p
|
||||
}
|
||||
|
||||
// BeforeHour 获取n小时前的时间
|
||||
func (p Pro) BeforeHour(hour int) Pro {
|
||||
st, _ := time.ParseDuration(fmt.Sprintf("-%dh", hour))
|
||||
p.Time = p.Time.Add(st)
|
||||
return p
|
||||
}
|
||||
|
||||
// AfterHour 获取n小时后的时间
|
||||
func (p Pro) AfterHour(hour int) Pro {
|
||||
st, _ := time.ParseDuration(fmt.Sprintf("+%dh", hour))
|
||||
p.Time = p.Time.Add(st)
|
||||
return p
|
||||
}
|
||||
|
||||
// BeforeDay 获取n天前的时间
|
||||
func (p Pro) BeforeDay(day int) Pro {
|
||||
p.Time = p.Time.AddDate(0, 0, -day)
|
||||
return p
|
||||
}
|
||||
|
||||
// AfterDay 获取n天后的时间
|
||||
func (p Pro) AfterDay(day int) Pro {
|
||||
p.Time = p.Time.AddDate(0, 0, day)
|
||||
return p
|
||||
}
|
||||
|
||||
// SetFormat 格式化
|
||||
func (p Pro) SetFormat(layout string) string {
|
||||
return p.Time.Format(layout)
|
||||
}
|
||||
|
||||
// Month 获取当前月
|
||||
func (p Pro) Month() int {
|
||||
return p.MonthOfYear()
|
||||
}
|
||||
|
||||
// MonthOfYear 获取本年的第几月
|
||||
func (p Pro) MonthOfYear() int {
|
||||
return int(p.Time.In(p.loc).Month())
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package gotime
|
||||
|
||||
import "time"
|
||||
|
||||
// DiffInHour 相差多少小时
|
||||
func (p Pro) DiffInHour(t2 time.Time) (hour int64) {
|
||||
t2.Before(p.Time)
|
||||
diff := p.Time.Unix() - t2.Unix()
|
||||
hour = diff / 3600
|
||||
return hour
|
||||
}
|
||||
|
||||
// DiffInHourWithAbs 相差多少小时(绝对值)
|
||||
func (p Pro) DiffInHourWithAbs(t2 time.Time) (hour int64) {
|
||||
p.Time.Before(t2)
|
||||
diff := t2.Unix() - p.Time.Unix()
|
||||
hour = diff / 3600
|
||||
if hour > 0 {
|
||||
return hour
|
||||
}
|
||||
t2.Before(p.Time)
|
||||
diff = p.Time.Unix() - t2.Unix()
|
||||
hour = diff / 3600
|
||||
return hour
|
||||
}
|
||||
|
||||
// DiffInMinutes 相差多少分钟
|
||||
func (p Pro) DiffInMinutes(t2 time.Time) (hour int64) {
|
||||
t2.Before(p.Time)
|
||||
diff := p.Time.Unix() - t2.Unix()
|
||||
hour = diff / 60
|
||||
return hour
|
||||
}
|
||||
|
||||
// DiffInMinutesWithAbs 相差多少分钟(绝对值)
|
||||
func (p Pro) DiffInMinutesWithAbs(t2 time.Time) (hour int64) {
|
||||
p.Time.Before(t2)
|
||||
diff := t2.Unix() - p.Time.Unix()
|
||||
hour = diff / 60
|
||||
if hour > 0 {
|
||||
return hour
|
||||
}
|
||||
t2.Before(p.Time)
|
||||
diff = p.Time.Unix() - t2.Unix()
|
||||
hour = diff / 60
|
||||
return hour
|
||||
}
|
||||
|
||||
// DiffInSecond 相差多少秒
|
||||
func (p Pro) DiffInSecond(t2 time.Time) (hour int64) {
|
||||
t2.Before(p.Time)
|
||||
diff := p.Time.Unix() - t2.Unix()
|
||||
hour = diff
|
||||
return hour
|
||||
}
|
||||
|
||||
// DiffInSecondWithAbs 相差多少秒(绝对值)
|
||||
func (p Pro) DiffInSecondWithAbs(t2 time.Time) (hour int64) {
|
||||
p.Time.Before(t2)
|
||||
diff := t2.Unix() - p.Time.Unix()
|
||||
hour = diff
|
||||
if hour > 0 {
|
||||
return hour
|
||||
}
|
||||
t2.Before(p.Time)
|
||||
diff = p.Time.Unix() - t2.Unix()
|
||||
hour = diff
|
||||
return hour
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package gotime
|
||||
|
||||
import "fmt"
|
||||
|
||||
// invalidTimezoneError 无效的时区错误
|
||||
var invalidTimezoneError = func(timezone string) error {
|
||||
return fmt.Errorf("invalid timezone %q, please see the file %q for all valid timezones", timezone, "$GOROOT/lib/time/zoneinfo.zip")
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package gotime
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// 通过时区获取 Location 实例
|
||||
func getLocationByTimezone(timezone string) (*time.Location, error) {
|
||||
loc, err := time.LoadLocation(timezone)
|
||||
if err != nil {
|
||||
err = invalidTimezoneError(timezone)
|
||||
}
|
||||
return loc, err
|
||||
}
|
@ -0,0 +1,124 @@
|
||||
package gotime
|
||||
|
||||
import "time"
|
||||
|
||||
// 数字常量
|
||||
const (
|
||||
YearsPerMillennium = 1000 // 每千年1000年
|
||||
YearsPerCentury = 100 // 每世纪100年
|
||||
YearsPerDecade = 10 // 每十年10年
|
||||
QuartersPerYear = 4 // 每年4季度
|
||||
MonthsPerYear = 12 // 每年12月
|
||||
MonthsPerQuarter = 3 // 每季度3月
|
||||
WeeksPerNormalYear = 52 // 每常规年52周
|
||||
weeksPerLongYear = 53 // 每长年53周
|
||||
WeeksPerMonth = 4 // 每月4周
|
||||
DaysPerLeapYear = 366 // 每闰年366天
|
||||
DaysPerNormalYear = 365 // 每常规年365天
|
||||
DaysPerWeek = 7 // 每周7天
|
||||
HoursPerWeek = 168 // 每周168小时
|
||||
HoursPerDay = 24 // 每天24小时
|
||||
MinutesPerDay = 1440 // 每天1440分钟
|
||||
MinutesPerHour = 60 // 每小时60分钟
|
||||
SecondsPerWeek = 604800 // 每周604800秒
|
||||
SecondsPerDay = 86400 // 每天86400秒
|
||||
SecondsPerHour = 3600 // 每小时3600秒
|
||||
SecondsPerMinute = 60 // 每分钟60秒
|
||||
MillisecondsPerSecond = 1000 // 每秒1000毫秒
|
||||
MicrosecondsPerMillisecond = 1000 // 每毫秒1000微秒
|
||||
MicrosecondsPerSecond = 1000000 // 每秒1000000微秒
|
||||
)
|
||||
|
||||
// StartOfCentury 本世纪开始时间
|
||||
func (p Pro) StartOfCentury() Pro {
|
||||
p.Time = time.Date(p.Time.Year()/YearsPerCentury*YearsPerCentury, 1, 1, 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfCentury 本世纪结束时间
|
||||
func (p Pro) EndOfCentury() Pro {
|
||||
p.Time = time.Date(p.Time.Year()/YearsPerCentury*YearsPerCentury+99, 12, 31, 23, 59, 59, 999999999, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// StartOfDecade 本年代开始时间
|
||||
func (p Pro) StartOfDecade() Pro {
|
||||
p.Time = time.Date(p.Time.Year()/YearsPerDecade*YearsPerDecade, 1, 1, 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfDecade 本年代结束时间
|
||||
func (p Pro) EndOfDecade() Pro {
|
||||
p.Time = time.Date(p.Time.Year()/YearsPerDecade*YearsPerDecade+9, 12, 31, 23, 59, 59, 999999999, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// StartOfYear 本年开始时间
|
||||
func (p Pro) StartOfYear() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), 1, 1, 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfYear 本年结束时间
|
||||
func (p Pro) EndOfYear() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), 12, 31, 23, 59, 59, 999999999, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// Quarter 获取当前季度
|
||||
func (p Pro) Quarter() (quarter int) {
|
||||
switch {
|
||||
case p.Time.Month() >= 10:
|
||||
quarter = 4
|
||||
case p.Time.Month() >= 7:
|
||||
quarter = 3
|
||||
case p.Time.Month() >= 4:
|
||||
quarter = 2
|
||||
case p.Time.Month() >= 1:
|
||||
quarter = 1
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// StartOfQuarter 本季度开始时间
|
||||
func (p Pro) StartOfQuarter() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), time.Month(3*p.Quarter()-2), 1, 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfQuarter 本季度结束时间
|
||||
func (p Pro) EndOfQuarter() Pro {
|
||||
quarter, day := p.Quarter(), 30
|
||||
switch quarter {
|
||||
case 1, 4:
|
||||
day = 31
|
||||
case 2, 3:
|
||||
day = 30
|
||||
}
|
||||
p.Time = time.Date(p.Time.Year(), time.Month(3*quarter), day, 23, 59, 59, 999999999, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// StartOfMonth 本月开始时间
|
||||
func (p Pro) StartOfMonth() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), time.Month(p.Month()), 1, 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfMonth 本月结束时间
|
||||
func (p Pro) EndOfMonth() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), time.Month(p.Month()), 1, 23, 59, 59, 999999999, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// StartOfDay 本日开始时间
|
||||
func (p Pro) StartOfDay() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 0, 0, 0, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
||||
|
||||
// EndOfDay 本日结束时间
|
||||
func (p Pro) EndOfDay() Pro {
|
||||
p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 23, 59, 59, 0, p.Time.Location())
|
||||
return p
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package gotime
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Yesterday 昨天
|
||||
func Yesterday() Pro {
|
||||
p := NewPro()
|
||||
location, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
p.Time = time.Now().Add(time.Hour*8).AddDate(0, 0, -1)
|
||||
} else {
|
||||
p.Time = time.Now().In(location).AddDate(0, 0, -1)
|
||||
}
|
||||
return p
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package gouuid
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// GetUuId 获取唯一ID
|
||||
func GetUuId() string {
|
||||
unix32bits := uint32(time.Now().UTC().Unix())
|
||||
buff := make([]byte, 12)
|
||||
numRead, err := rand.Read(buff)
|
||||
if numRead != len(buff) || err != nil {
|
||||
return ""
|
||||
}
|
||||
return fmt.Sprintf("%x-%x-%x-%x-%x-%x", unix32bits, buff[0:2], buff[2:4], buff[4:6], buff[6:8], buff[8:])
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package phpjson
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Encode(v interface{}) (string, error) {
|
||||
bytes, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(bytes), nil
|
||||
}
|
||||
|
||||
func MarshalToString(msg interface{}) (string, error) {
|
||||
j, e := json.Marshal(msg)
|
||||
if e != nil {
|
||||
return "", e
|
||||
}
|
||||
return string(j), nil
|
||||
}
|
||||
|
||||
func Implode(list interface{}, seq string) string {
|
||||
listValue := reflect.Indirect(reflect.ValueOf(list))
|
||||
if listValue.Kind() != reflect.Slice {
|
||||
return ""
|
||||
}
|
||||
count := listValue.Len()
|
||||
listStr := make([]string, 0, count)
|
||||
for i := 0; i < count; i++ {
|
||||
v := listValue.Index(i)
|
||||
if str, err := getValue(v); err == nil {
|
||||
listStr = append(listStr, str)
|
||||
}
|
||||
}
|
||||
return strings.Join(listStr, seq)
|
||||
}
|
||||
|
||||
func getValue(value reflect.Value) (res string, err error) {
|
||||
switch value.Kind() {
|
||||
case reflect.Ptr:
|
||||
res, err = getValue(value.Elem())
|
||||
default:
|
||||
res = fmt.Sprint(value.Interface())
|
||||
}
|
||||
return
|
||||
}
|
Loading…
Reference in new issue