From ea25212d33ed4af2a682f83c6a3e4559a1ba9f36 Mon Sep 17 00:00:00 2001
From: dorlolo <428192774@qq.com>
Date: Tue, 29 Mar 2022 11:37:40 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8D=E5=88=9Dinitbody?=
 =?UTF-8?q?=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 headers.go                          |  10 ++-
 simpleRequest.go                    |  19 +++--
 test/simpleCrypto/ecb.go            |  76 +++++++++++++++++
 test/simpleCrypto/ecb_test.go       | 125 ++++++++++++++++++++++++++++
 test/simpleCrypto/readme.md         |   4 +
 test/simpleCrypto/simpleCrypto.go   |  45 ++++++++++
 test/simpleRequest_test.go          |  59 ++++++++++++-
 test/timeUtil/format.go             |  55 ++++++++++++
 test/timeUtil/getTime.go            |  65 +++++++++++++++
 test/timeUtil/getTime_test.go       |  20 +++++
 test/timeUtil/timeTranslate.go      |  65 +++++++++++++++
 test/timeUtil/timeTranslate_test.go |  22 +++++
 utils.go                            |  17 ++++
 13 files changed, 570 insertions(+), 12 deletions(-)
 create mode 100644 test/simpleCrypto/ecb.go
 create mode 100644 test/simpleCrypto/ecb_test.go
 create mode 100644 test/simpleCrypto/readme.md
 create mode 100644 test/simpleCrypto/simpleCrypto.go
 create mode 100644 test/timeUtil/format.go
 create mode 100644 test/timeUtil/getTime.go
 create mode 100644 test/timeUtil/getTime_test.go
 create mode 100644 test/timeUtil/timeTranslate.go
 create mode 100644 test/timeUtil/timeTranslate_test.go
 create mode 100644 utils.go

diff --git a/headers.go b/headers.go
index 1a9c03a..611c96a 100644
--- a/headers.go
+++ b/headers.go
@@ -25,7 +25,6 @@ var (
 	hdrContentEncodingKey = http.CanonicalHeaderKey("Content-Encoding")
 	hdrLocationKey        = http.CanonicalHeaderKey("Location")
 
-	plainTextType      = "text/plain; charset=utf-8"
 	jsonContentType    = "application/json"
 	formUrlencodedType = "application/x-www-form-urlencoded"
 	formDataType       = "multipart/form-data"
@@ -33,6 +32,8 @@ var (
 	textPlainType      = "text/plain"
 	javaScriptType     = "javascript"
 
+	charsetUtf8 = "charset=utf-8"
+
 	jsonCheck = regexp.MustCompile(`(?i:(application|text)/(json|.*\+json|json\-.*)(;|$))`)
 	xmlCheck  = regexp.MustCompile(`(?i:(application|text)/(xml|.*\+xml)(;|$))`)
 	bufPool   = &sync.Pool{New: func() interface{} { return &bytes.Buffer{} }}
@@ -109,6 +110,11 @@ func (s *HeadersConf) ConentType_json() *HeadersConf {
 	return s
 }
 
+func (s *HeadersConf) ConentType_charsetUtf8() *HeadersConf {
+	s.simpleReq.headers.Add(hdrContentTypeKey, charsetUtf8)
+	return s
+}
+
 func (s *HeadersConf) ConentType_formData() *HeadersConf {
 	//tmp := url.Values{}
 
@@ -123,7 +129,7 @@ func (s *HeadersConf) ConentType_formUrlencoded() *HeadersConf {
 	return s
 }
 func (s *HeadersConf) ConentType_textPlain() *HeadersConf {
-	s.simpleReq.headers.Set(hdrContentTypeKey, plainTextType)
+	s.simpleReq.headers.Set(hdrContentTypeKey, textPlainType)
 	return s
 }
 
diff --git a/simpleRequest.go b/simpleRequest.go
index 06f00f5..46d6a26 100644
--- a/simpleRequest.go
+++ b/simpleRequest.go
@@ -218,7 +218,7 @@ func (s *SimpleRequest) Get(urls string) (body []byte, err error) {
 func (s *SimpleRequest) initBody() {
 	contentTypeData := s.headers.Get(hdrContentTypeKey)
 	switch {
-	case contentTypeData == jsonContentType:
+	case IsJSONType(contentTypeData):
 		jsonData, err := json.Marshal(s.tempBody)
 		if err == nil {
 			s.body = bytes.NewReader(jsonData)
@@ -234,12 +234,10 @@ func (s *SimpleRequest) initBody() {
 			case string:
 				strSv, _ := sv.(string)
 				_ = writer.WriteField(k, strSv)
-				//data.Set(k, strSv)
 			case []string:
 				sss, _ := sv.([]string)
 				for _, v := range sss {
 					_ = writer.WriteField(k, v)
-					//data.Add(k, v)
 				}
 			}
 		}
@@ -248,21 +246,24 @@ func (s *SimpleRequest) initBody() {
 			panic(err)
 		}
 		s.headers.Set("Content-Type", writer.FormDataContentType())
-		//strD := data.Encode()
-		//bodyText := strings.NewReader(strD)
 		s.body = body
-
-	case contentTypeData == xmlDataType || contentTypeData == textPlainType || contentTypeData == javaScriptType:
+	case IsXMLType(contentTypeData):
+		//application/soap+xml ,application/xml
 		data, _ := s.tempBody[stringBodyType].(string)
 		s.body = strings.NewReader(data)
-	case contentTypeData == "":
+	case strings.Contains(contentTypeData, "text") || strings.Contains(contentTypeData, javaScriptType):
+		data, _ := s.tempBody[stringBodyType].(string)
+		s.body = strings.NewReader(data)
+	case contentTypeData == "" || strings.Contains(contentTypeData, "form"):
+		//默认为x-www-form-urlencoded格式
+		//x-www-form-urlencoded ,multipart/form-data ..等form格式走此方法
 		tmpData := url.Values{}
 		for k, v := range tmpData {
 			tmpData.Set(k, fmt.Sprintf("%v", v))
 		}
 		s.body = strings.NewReader(tmpData.Encode())
 		s.Headers().ConentType_formUrlencoded()
-	default: //x-www-form-urlencoded ,multipart/form-data ..
+	default:
 		tmpData := url.Values{}
 		for k, v := range tmpData {
 			tmpData.Set(k, fmt.Sprintf("%v", v))
diff --git a/test/simpleCrypto/ecb.go b/test/simpleCrypto/ecb.go
new file mode 100644
index 0000000..d5c2f63
--- /dev/null
+++ b/test/simpleCrypto/ecb.go
@@ -0,0 +1,76 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Electronic Code Book (ECB) mode.
+
+// ECB provides confidentiality by assigning a fixed ciphertext block to each
+// plaintext block.
+
+// See NIST SP 800-38A, pp 08-09
+
+package simpleCrypto
+
+import (
+	"crypto/cipher"
+)
+
+type ecb struct {
+	b         cipher.Block
+	blockSize int
+}
+
+func newECB(b cipher.Block) *ecb {
+	return &ecb{
+		b:         b,
+		blockSize: b.BlockSize(),
+	}
+}
+
+type ecbEncrypter ecb
+
+// NewECBEncrypter returns a BlockMode which encrypts in electronic code book
+// mode, using the given Block.
+func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
+	return (*ecbEncrypter)(newECB(b))
+}
+
+func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
+
+func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
+	if len(src)%x.blockSize != 0 {
+		panic("crypto/cipher: input not full blocks")
+	}
+	if len(dst) < len(src) {
+		panic("crypto/cipher: output smaller than input")
+	}
+	for len(src) > 0 {
+		x.b.Encrypt(dst, src[:x.blockSize])
+		src = src[x.blockSize:]
+		dst = dst[x.blockSize:]
+	}
+}
+
+type ecbDecrypter ecb
+
+// NewECBDecrypter returns a BlockMode which decrypts in electronic code book
+// mode, using the given Block.
+func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
+	return (*ecbDecrypter)(newECB(b))
+}
+
+func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
+
+func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
+	if len(src)%x.blockSize != 0 {
+		panic("crypto/cipher: input not full blocks")
+	}
+	if len(dst) < len(src) {
+		panic("crypto/cipher: output smaller than input")
+	}
+	for len(src) > 0 {
+		x.b.Decrypt(dst, src[:x.blockSize])
+		src = src[x.blockSize:]
+		dst = dst[x.blockSize:]
+	}
+}
diff --git a/test/simpleCrypto/ecb_test.go b/test/simpleCrypto/ecb_test.go
new file mode 100644
index 0000000..7318a2a
--- /dev/null
+++ b/test/simpleCrypto/ecb_test.go
@@ -0,0 +1,125 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// ECB AES test vectors.
+
+// See U.S. National Institute of Standards and Technology (NIST)
+// Special Publication 800-38A, ``Recommendation for Block Cipher
+// Modes of Operation,'' 2001 Edition, pp. 24-29.
+
+package simpleCrypto
+
+import (
+	"bytes"
+	"crypto/aes"
+	"encoding/base64"
+	"fmt"
+	"testing"
+)
+
+var commonKey128 = []byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}
+
+var commonKey192 = []byte{
+	0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
+	0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,
+}
+
+var commonKey256 = []byte{
+	0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
+	0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
+}
+var commonInput = []byte{
+	0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
+	0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
+	0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
+	0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10,
+}
+
+var ecbAESTests = []struct {
+	name string
+	key  []byte
+	in   []byte
+	out  []byte
+}{
+	// NIST SP 800-38A pp 24-27
+	{
+		"ECB-AES128",
+		commonKey128,
+		commonInput,
+		[]byte{
+			0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60, 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97,
+			0xf5, 0xd3, 0xd5, 0x85, 0x03, 0xb9, 0x69, 0x9d, 0xe7, 0x85, 0x89, 0x5a, 0x96, 0xfd, 0xba, 0xaf,
+			0x43, 0xb1, 0xcd, 0x7f, 0x59, 0x8e, 0xce, 0x23, 0x88, 0x1b, 0x00, 0xe3, 0xed, 0x03, 0x06, 0x88,
+			0x7b, 0x0c, 0x78, 0x5e, 0x27, 0xe8, 0xad, 0x3f, 0x82, 0x23, 0x20, 0x71, 0x04, 0x72, 0x5d, 0xd4,
+		},
+	},
+	{
+		"ECB-AES192",
+		commonKey192,
+		commonInput,
+		[]byte{
+			0xbd, 0x33, 0x4f, 0x1d, 0x6e, 0x45, 0xf2, 0x5f, 0xf7, 0x12, 0xa2, 0x14, 0x57, 0x1f, 0xa5, 0xcc,
+			0x97, 0x41, 0x04, 0x84, 0x6d, 0x0a, 0xd3, 0xad, 0x77, 0x34, 0xec, 0xb3, 0xec, 0xee, 0x4e, 0xef,
+			0xef, 0x7a, 0xfd, 0x22, 0x70, 0xe2, 0xe6, 0x0a, 0xdc, 0xe0, 0xba, 0x2f, 0xac, 0xe6, 0x44, 0x4e,
+			0x9a, 0x4b, 0x41, 0xba, 0x73, 0x8d, 0x6c, 0x72, 0xfb, 0x16, 0x69, 0x16, 0x03, 0xc1, 0x8e, 0x0e,
+		},
+	},
+	{
+		"ECB-AES256",
+		commonKey256,
+		commonInput,
+		[]byte{
+			0xf3, 0xee, 0xd1, 0xbd, 0xb5, 0xd2, 0xa0, 0x3c, 0x06, 0x4b, 0x5a, 0x7e, 0x3d, 0xb1, 0x81, 0xf8,
+			0x59, 0x1c, 0xcb, 0x10, 0xd4, 0x10, 0xed, 0x26, 0xdc, 0x5b, 0xa7, 0x4a, 0x31, 0x36, 0x28, 0x70,
+			0xb6, 0xed, 0x21, 0xb9, 0x9c, 0xa6, 0xf4, 0xf9, 0xf1, 0x53, 0xe7, 0xb1, 0xbe, 0xaf, 0xed, 0x1d,
+			0x23, 0x30, 0x4b, 0x7a, 0x39, 0xf9, 0xf3, 0xff, 0x06, 0x7d, 0x8d, 0x8f, 0x9e, 0x24, 0xec, 0xc7,
+		},
+	},
+}
+
+func TestECB_AES(t *testing.T) {
+	for _, tt := range ecbAESTests {
+		test := tt.name
+
+		c, err := aes.NewCipher(tt.key)
+		if err != nil {
+			t.Errorf("%s: NewCipher(%d bytes) = %s", test, len(tt.key), err)
+			continue
+		}
+
+		encrypter := NewECBEncrypter(c)
+		d := make([]byte, len(tt.in))
+		encrypter.CryptBlocks(d, tt.in)
+		if !bytes.Equal(tt.out, d) {
+			t.Errorf("%s: ECBEncrypter\nhave %x\nwant %x", test, d, tt.out)
+		}
+
+		decrypter := NewECBDecrypter(c)
+		p := make([]byte, len(d))
+		decrypter.CryptBlocks(p, d)
+		if !bytes.Equal(tt.in, p) {
+			t.Errorf("%s: ECBDecrypter\nhave %x\nwant %x", test, d, tt.in)
+		}
+	}
+}
+
+//func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
+//	padding := blockSize - len(ciphertext)%blockSize
+//	fmt.Println(padding)
+//	fmt.Println(len(ciphertext))
+//	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+//	return append(ciphertext, padtext...)
+//}
+
+func TestSelfECB(t *testing.T) {
+	combstr := []byte("dbc679fc7f4185e8:0092f9d7-01d6-44f1-b738-f557813d58e9:1575534561309")
+	fmt.Println(len(combstr))
+	aeskey := []byte("yMY5J6iYnwPvxWGD")
+	c, _ := aes.NewCipher(aeskey)
+	encrypter := NewECBEncrypter(c)
+	combstr = PKCS5Padding(combstr, c.BlockSize())
+	d := make([]byte, len(combstr))
+	encrypter.CryptBlocks(d, combstr)
+	fmt.Println(base64.StdEncoding.EncodeToString(d))
+}
diff --git a/test/simpleCrypto/readme.md b/test/simpleCrypto/readme.md
new file mode 100644
index 0000000..058bc80
--- /dev/null
+++ b/test/simpleCrypto/readme.md
@@ -0,0 +1,4 @@
+# simpleCrypto
+## 说明
+目前封装了md5、ecb加密的方法。  
+具体内容请查看simpleCrypto.go文件。
\ No newline at end of file
diff --git a/test/simpleCrypto/simpleCrypto.go b/test/simpleCrypto/simpleCrypto.go
new file mode 100644
index 0000000..799df06
--- /dev/null
+++ b/test/simpleCrypto/simpleCrypto.go
@@ -0,0 +1,45 @@
+/*
+ * @FileName:
+ * @Author:		xjj
+ * @CreateTime:	下午6:23
+ * @Description:
+ */
+package simpleCrypto
+
+import (
+	"bytes"
+	"crypto/aes"
+	"crypto/md5"
+	"encoding/base64"
+	"encoding/hex"
+	"sync"
+)
+
+var lock sync.Mutex
+
+//Md5Enscrypto md5加密
+func Md5Enscrypto(data string) string {
+	m := md5.New()
+	m.Write([]byte(data))
+	res := hex.EncodeToString(m.Sum(nil))
+	return res
+}
+
+//SimpleEncryptAesECB ECB加密,并对加密结果进行了base64编码
+func SimpleEncryptAesECB(aesText []byte, aesKey []byte) string {
+	lock.Lock()
+	c, _ := aes.NewCipher(aesKey)
+	encrypter := NewECBEncrypter(c)
+	aesText = PKCS5Padding(aesText, c.BlockSize())
+	d := make([]byte, len(aesText))
+	encrypter.CryptBlocks(d, aesText)
+	lock.Unlock()
+	return base64.StdEncoding.EncodeToString(d)
+}
+
+//PKCS5Padding PKCS5明文填充方案,此方案使明文保持为块长度的倍数
+func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+	return append(ciphertext, padtext...)
+}
diff --git a/test/simpleRequest_test.go b/test/simpleRequest_test.go
index 8e131a7..41e1de9 100644
--- a/test/simpleRequest_test.go
+++ b/test/simpleRequest_test.go
@@ -10,7 +10,10 @@ package test
 import (
 	"fmt"
 	"github.com/dorlolo/simpleRequest"
-
+	"github.com/dorlolo/simpleRequest/test/simpleCrypto"
+	"github.com/dorlolo/simpleRequest/test/timeUtil"
+	"net/http"
+	"strings"
 	"testing"
 	"time"
 )
@@ -78,3 +81,57 @@ func TestAuthorization(t *testing.T) {
 	t.Log(err)
 
 }
+
+func TestXml(t *testing.T) {
+	idcard := "320324196705101880"
+	thisDate := time.Now().Format(timeUtil.TimeFormat.NoSpacer_YMD)
+	passStr := fmt.Sprintf("%v%vsparkcn", idcard, thisDate)
+	pass := simpleCrypto.Md5Enscrypto(passStr)
+	urlAddr := "http://218.4.84.171:5445/AppWebService/GHBackBone_SAMWS.asmx?Content-Type=application/soap+xml;charset=utf-8"
+	body := fmt.Sprintf(`<?xml version="1.0" encoding="utf-8"?>
+<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
+    <soap12:Body>
+        <GetWorkerSAM xmlns="http://tempuri.org/">
+            <zjhm>%v</zjhm>
+            <pass>%v</pass>
+        </GetWorkerSAM>
+    </soap12:Body>
+</soap12:Envelope>`, idcard, pass)
+	req := simpleRequest.NewRequest()
+	req.Headers().Set("Content-Type", "application/soap+xml;charset=utf-8")
+	req.Headers().SetRandomUerAgent()
+	req.Body().SetString(body)
+	data, err := req.Post(urlAddr)
+	t.Log(string(data))
+	t.Log(err)
+	return
+}
+
+func TestIsJsonType(t *testing.T) {
+	var headers = http.Header{}
+	headers.Set("Content-Type", "application/json")
+	headers.Add("Content-Type", "charset=UTF-8")
+	RES := simpleRequest.IsJSONType(headers.Get("Content-Type"))
+	t.Log(RES)
+
+}
+func TestIsXmlType(t *testing.T) {
+	var headers = http.Header{}
+	headers.Add("Content-Type", "application/soap+xml;charset=utf-8")
+	RES := simpleRequest.IsXMLType(headers.Get("Content-Type"))
+	t.Log(RES)
+}
+
+func TestTextPlain(t *testing.T) {
+
+	var headers = http.Header{}
+	headers.Add("Content-Type", "text/plain;charset=utf-8")
+
+	res := strings.Contains(headers.Get("Content-Type"), "text")
+	if res {
+		t.Log(res)
+	} else {
+		t.Log(false)
+	}
+
+}
diff --git a/test/timeUtil/format.go b/test/timeUtil/format.go
new file mode 100644
index 0000000..5afc645
--- /dev/null
+++ b/test/timeUtil/format.go
@@ -0,0 +1,55 @@
+/*
+ * @FileName:   format.go
+ * @Author:		JuneXu
+ * @CreateTime:	2022/2/25 下午2:30
+ * @Description:
+ */
+
+package timeUtil
+
+import "time"
+
+var MonthMap = make(map[string]string)
+
+type DefineTimeFormat struct {
+	//常规时间格式(日期带横杠)
+	Normal_YMDhms string
+	Normal_YMD    string
+	Normal_hms    string
+	//带斜杠的时间格式
+	Slash_YMDhms string
+	Slash_YMD    string
+	//无间隔符
+	NoSpacer_YMDhms string
+	NoSpacer_YMD    string
+}
+
+var TimeFormat DefineTimeFormat
+var Loc *time.Location
+
+func init() {
+	MonthMap[""] = "00"
+	MonthMap["January"] = "01"
+	MonthMap["February"] = "02"
+	MonthMap["March"] = "03"
+	MonthMap["April"] = "04"
+	MonthMap["May"] = "05"
+	MonthMap["June"] = "06"
+	MonthMap["July"] = "07"
+	MonthMap["August"] = "08"
+	MonthMap["September"] = "09"
+	MonthMap["October"] = "10"
+	MonthMap["November"] = "11"
+	MonthMap["December"] = "12"
+
+	TimeFormat = DefineTimeFormat{
+		Normal_YMDhms:   "2006-01-02 15:04:05",
+		Normal_YMD:      "2006-01-02",
+		Normal_hms:      "15:04:05",
+		Slash_YMDhms:    "2006/01/02 15:04:05",
+		Slash_YMD:       "2006/01/02",
+		NoSpacer_YMDhms: "20060102150405",
+		NoSpacer_YMD:    "20060102",
+	}
+	Loc, _ = time.LoadLocation("Asia/Shanghai")
+}
diff --git a/test/timeUtil/getTime.go b/test/timeUtil/getTime.go
new file mode 100644
index 0000000..387fa37
--- /dev/null
+++ b/test/timeUtil/getTime.go
@@ -0,0 +1,65 @@
+/*
+ * @FileName:   getTime.go
+ * @Author:		JuneXu
+ * @CreateTime:	2022/3/1 下午6:35
+ * @Description:
+ */
+
+package timeUtil
+
+import (
+	"fmt"
+	"time"
+)
+
+//ThisMormingTime 今天凌晨
+func ThisMorming(format string) (strTime string) {
+	thisTime := time.Now()
+	year := thisTime.Year()
+	month := MonthMap[thisTime.Month().String()]
+	day := fmt.Sprintf("%02d", thisTime.Day())
+	strTime = fmt.Sprintf("%v-%v-%v 00:00:00", year, month, day)
+	if format != TimeFormat.Normal_YMDhms {
+		t1, _ := time.ParseInLocation(TimeFormat.Normal_YMDhms, strTime, Loc)
+		strTime = t1.Format(format)
+	}
+	return strTime
+}
+
+//ThisMorningUnix 获取当日凌晨的时间戳
+func ThisMorningToUnix() int64 {
+	thist := time.Now()
+	zero_tm := time.Date(thist.Year(), thist.Month(), thist.Day(), 0, 0, 0, 0, thist.Location()).Unix()
+	return zero_tm
+}
+
+//ThisTimeUnix 获取当前时间的时间戳
+func CurrentimeToUnix() int64 {
+	return time.Now().Unix()
+}
+
+//CurrenStrtime 获取当前时间字符串
+func CurrenStrtime(format string) (strTime string) {
+	strTime = time.Now().Format(format)
+	return
+}
+
+//Currentime 获取当前时间
+func Currentime() (thisTime time.Time) {
+	thisTime = time.Now().In(Loc)
+	return
+}
+
+//Currentime 获取当前时间
+func Currentime2(format string) (strTime string) {
+	strTime = time.Now().Format(format)
+	return
+}
+
+//HoursAgo 若干小时之前的时间
+func HoursAgo(hours time.Duration, format string) (lastTimeStr string) {
+	lastStamp := time.Now().Unix() - int64((time.Hour * hours).Seconds())
+	lastTime := time.Unix(lastStamp, 0).In(Loc)
+	lastTimeStr = lastTime.Format(format)
+	return
+}
diff --git a/test/timeUtil/getTime_test.go b/test/timeUtil/getTime_test.go
new file mode 100644
index 0000000..7f834f4
--- /dev/null
+++ b/test/timeUtil/getTime_test.go
@@ -0,0 +1,20 @@
+/*
+ * @FileName:   getTime_test.go
+ * @Author:		JuneXu
+ * @CreateTime:	2022/3/21 下午5:58
+ * @Description:
+ */
+
+package timeUtil
+
+import (
+	"testing"
+)
+
+func TestTimett(t *testing.T) {
+	t.Log(ThisMorming(TimeFormat.Normal_YMDhms))
+	t.Log(Currentime())
+	t.Log(Currentime2(TimeFormat.Normal_YMDhms))
+	t.Log(HoursAgo(5, TimeFormat.Normal_YMDhms))
+	t.Log(HoursAgo(5, TimeFormat.Normal_YMDhms))
+}
diff --git a/test/timeUtil/timeTranslate.go b/test/timeUtil/timeTranslate.go
new file mode 100644
index 0000000..d86a836
--- /dev/null
+++ b/test/timeUtil/timeTranslate.go
@@ -0,0 +1,65 @@
+/**
+ * @Author Puzzle
+ * @Date 2021/11/18 1:36 下午
+ **/
+
+package timeUtil
+
+import (
+	"fmt"
+	"time"
+)
+
+func GetTimestampMillisecond() int64 {
+	now := time.Now()
+	return now.UnixNano() / 1e6
+}
+
+func StringToTime(strTime string) (*time.Time, error) {
+	const TIME_LAYOUT = "2006-01-02 15:04:05" //此时间不可更改
+	timeobj, err := time.ParseInLocation(TIME_LAYOUT, strTime, Loc)
+	return &timeobj, err
+}
+
+func StringToTimeWithFormat(strTime string, timeFormat string) (*time.Time, error) {
+	timeobj, err := time.ParseInLocation(timeFormat, strTime, Loc)
+	return &timeobj, err
+}
+
+//去除精确时间后面的小数点
+func NowTimeToTime(layout string) *time.Time {
+	otime := time.Now().Format(layout) //"2006-01-02 15:04:05" and so on
+	tt, _ := StringToTime(otime)
+	return tt
+}
+
+// timeToString
+func TimeToString(timer time.Time) string {
+	//t1 := time.Now()
+	t2 := timer.Format("2006-01-02 15:04:05")
+	fmt.Println(t2)
+	return t2
+}
+
+// todo
+//func commonParse_stringToTime(timeStr string) *time.Time {
+//const spaceList =[4,2,2,2,2,2]
+//var timeMap struct {
+//	year   string
+//	month  string
+//	day    string
+//	hour   string
+//	minute string
+//	second string
+//}
+//
+//for k, v := range timeStr {
+//	fmt.Println()
+//}
+
+//测试能否被int64化,如果能够转化说明全是数字
+// 替换-为""
+// 替换/为""
+// 替换:为""
+
+//}
diff --git a/test/timeUtil/timeTranslate_test.go b/test/timeUtil/timeTranslate_test.go
new file mode 100644
index 0000000..44e467b
--- /dev/null
+++ b/test/timeUtil/timeTranslate_test.go
@@ -0,0 +1,22 @@
+/*
+ * @FileName:   time_test.go
+ * @Author:		JuneXu
+ * @CreateTime:	2022/2/25 下午2:37
+ * @Description:
+ */
+
+package timeUtil
+
+import (
+	"fmt"
+	"testing"
+	"time"
+)
+
+func TestTime(t *testing.T) {
+	result := NowTimeToTime(TimeFormat.Normal_YMDhms)
+	fmt.Println(result)
+
+	TimeToString(time.Now())
+	t.Log(NowTimeToTime(TimeFormat.Normal_YMD))
+}
diff --git a/utils.go b/utils.go
new file mode 100644
index 0000000..1cc8c78
--- /dev/null
+++ b/utils.go
@@ -0,0 +1,17 @@
+/*
+ * @FileName:   utils.go
+ * @Author:		JuneXu
+ * @CreateTime:	2022/3/29 上午11:16
+ * @Description:
+ */
+
+package simpleRequest
+
+func IsJSONType(ct string) bool {
+	return jsonCheck.MatchString(ct)
+}
+
+// IsXMLType method is to check XML content type or not
+func IsXMLType(ct string) bool {
+	return xmlCheck.MatchString(ct)
+}