|
@@ -3,6 +3,7 @@ package date
|
|
|
import (
|
|
|
"database/sql/driver"
|
|
|
"errors"
|
|
|
+ "regexp"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
@@ -11,6 +12,14 @@ type Datetime time.Time
|
|
|
|
|
|
const NormalDatetimeFormat = "2006-01-02 15:04:05"
|
|
|
|
|
|
+var (
|
|
|
+ datePattern *regexp.Regexp
|
|
|
+)
|
|
|
+
|
|
|
+func init() {
|
|
|
+ datePattern, _ = regexp.Compile(`([-:\s])(\d)([-:\s])`)
|
|
|
+}
|
|
|
+
|
|
|
func (t Datetime) MarshalJSON() ([]byte, error) {
|
|
|
if y := t.Year(); y < 0 || y >= 10000 {
|
|
|
return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
|
|
@@ -58,7 +67,7 @@ func (t Datetime) FromString(str string) Datetime {
|
|
|
}
|
|
|
|
|
|
func ParseDatetime(str string) Datetime {
|
|
|
- str = strings.TrimSpace(str)
|
|
|
+ str = dateStrFormat(str)
|
|
|
tm, err := time.Parse(NormalDatetimeFormat, str)
|
|
|
if nil != err {
|
|
|
return Unix(0, 0)
|
|
@@ -379,3 +388,27 @@ func Until(t Datetime) time.Duration {
|
|
|
func Unix(sec int64, nsec int64) Datetime {
|
|
|
return Datetime(time.Unix(sec, nsec))
|
|
|
}
|
|
|
+
|
|
|
+func dateStrFormat(input string) string {
|
|
|
+ input = strings.ReplaceAll(strings.TrimSpace(input), "/", "-")
|
|
|
+ if strings.Index(input, ":") > 0 && strings.Index(input, ":") == strings.LastIndex(input, ":") {
|
|
|
+ input = input + ":00"
|
|
|
+ }
|
|
|
+ for {
|
|
|
+ if datePattern.MatchString(input) {
|
|
|
+ input = datePattern.ReplaceAllString(input, `${1}0${2}${3}`)
|
|
|
+ } else {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if strings.Index(input, ":") == 1 {
|
|
|
+ input = "0" + input
|
|
|
+ }
|
|
|
+ length := len(input)
|
|
|
+ if length > 2 {
|
|
|
+ if strings.LastIndex(input, ":") == length-2 {
|
|
|
+ input = input[0:length-1] + "0" + input[length-1:]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return input
|
|
|
+}
|