1
1
package xtime
2
2
3
3
import (
4
+ "database/sql/driver"
5
+ "fmt"
6
+ xerr "github.com/goclub/error"
4
7
"log"
8
+ "strconv"
5
9
"time"
6
10
)
7
11
@@ -25,5 +29,135 @@ func InRange(target time.Time, r Range) (in bool) {
25
29
}
26
30
return
27
31
}
32
+ type Date struct {
33
+ Year int
34
+ Month time.Month
35
+ Day int
36
+ }
37
+ func NowDate (loc * time.Location ) Date {
38
+ year , month , day := time .Now ().In (loc ).Date ()
39
+ return Date {
40
+ Year : year ,
41
+ Month : month ,
42
+ Day : day ,
43
+ }
44
+ }
45
+ func NewDate (year int , month time.Month , day int ) Date {
46
+ return Date {
47
+ year , month ,day ,
48
+ }
49
+ }
50
+ func NewDateForTime (t time.Time ) Date {
51
+ return NewDate (t .Date ())
52
+ }
53
+ func NewDateForString (value string ) (d Date , err error ) {
54
+ t , err := time .Parse (LayoutDate , value ) ; if err != nil {
55
+ err = xerr .WithStack (err )
56
+ return
57
+ }
58
+ return NewDateForTime (t ), nil
59
+ }
60
+
61
+ func (d * Date ) UnmarshalJSON (b []byte ) error {
62
+ value , err := strconv .Unquote (string (b )) ; if err != nil {
63
+ return xerr .WithStack (err )
64
+ }
65
+ date , err := NewDateForString (value ) ; if err != nil {
66
+ return xerr .WithStack (err )
67
+ }
68
+ * d = date
69
+ return err
70
+ }
71
+
72
+ func (d Date ) MarshalJSON () ([]byte , error ) {
73
+ return []byte (`"` + d .String () + `"` ), nil
74
+ }
75
+ func (d Date ) Time (loc * time.Location ) time.Time {
76
+ return time .Date (d .Year , d .Month , d .Day , 0 ,0 ,0 ,0 , loc )
77
+ }
78
+ func (d Date ) ChinaTime () ChinaTime {
79
+ return NewChinaTime (d .Time (LocationChina ))
80
+ }
81
+ func (d Date ) String () string {
82
+ return time .Date (d .Year , d .Month , d .Day , 0 ,0 ,0 ,0 , time .UTC ).Format (LayoutDate )
83
+ }
84
+ func (d Date ) Value () (driver.Value , error ) {
85
+ return d .String (), nil
86
+ }
87
+ func (d * Date ) Scan (value interface {}) (err error ) {
88
+ if value == nil {
89
+ return xerr .New ("unsupported NULL xtime.date value, maybe you should use xtime.NullDate" )
90
+ }
91
+ var date Date
92
+ date , err = NewDateForString (fmt .Sprintf ("%s" , value )) ; if err != nil {
93
+ return
94
+ }
95
+ * d = date
96
+ return
97
+ }
98
+
99
+ type NullDate struct {
100
+ date Date
101
+ valid bool
102
+ }
103
+
104
+ func (v NullDate ) Date () Date {
105
+ return v .date
106
+ }
107
+ func (v * NullDate ) SetDate (date Date ) {
108
+ v .date = date
109
+ }
110
+ func (v NullDate ) Valid () bool {
111
+ return v .valid
112
+ }
113
+ func NewNullDate (year int , month time.Month , day int ) NullDate {
114
+ return NullDate {
115
+ date : NewDate (year , month , day ),
116
+ valid : true ,
117
+ }
118
+ }
119
+
120
+ func (d * NullDate ) UnmarshalJSON (b []byte ) error {
121
+ if string (b ) == "null" || string (b ) == "" {
122
+ d .valid = false
123
+ return nil
124
+ }
125
+ date := Date {}
126
+ err := date .UnmarshalJSON (b ) ; if err != nil {
127
+ return xerr .WithStack (err )
128
+ }
129
+ * d = NullDate {
130
+ date : date ,
131
+ valid : true ,
132
+ }
133
+ return err
134
+ }
28
135
29
- // func inRangeDate(begin string, end string, target string) bool
136
+ func (d NullDate ) MarshalJSON () ([]byte , error ) {
137
+ if d .valid {
138
+ return d .date .MarshalJSON ()
139
+ } else {
140
+ return []byte (`null` ), nil
141
+ }
142
+ }
143
+ func (d NullDate ) String () string {
144
+ if d .valid {
145
+ return d .date .String ()
146
+ }
147
+ return "null"
148
+ }
149
+
150
+ func (d NullDate ) Value () (driver.Value , error ) {
151
+ if d .valid {
152
+ return d .date .Value ()
153
+ }
154
+ return nil , nil
155
+ }
156
+ func (d * NullDate ) Scan (value interface {}) error {
157
+ if value == nil {
158
+ d .valid = false
159
+ return nil
160
+ }
161
+ d .valid = true
162
+ return d .date .Scan (value )
163
+ }
0 commit comments